在ASP.NET MVC 2中实现DropDownList的最佳方法?

在ASP.NET MVC 2中实现DropDownList的最佳方法?,asp.net,asp.net-mvc,asp.net-mvc-2,drop-down-menu,Asp.net,Asp.net Mvc,Asp.net Mvc 2,Drop Down Menu,我正在试图了解在ASP.NET MVC 2中使用DropDownListFor帮助程序实现DropDownList的最佳方法。这是一个多部分的问题 首先,将列表数据传递给视图的最佳方式是什么 使用包含数据的SelectList属性在模型中传递列表 通过ViewData 如何在下拉列表中获取空值?我应该在创建时将其构建到选择列表中,还是有其他方法告诉助手自动创建空值 最后,如果出于某种原因出现服务器端错误,我需要使用下拉列表重新显示屏幕,我是否需要再次获取列表值以传递到视图模型中?这些数据在发布之

我正在试图了解在ASP.NET MVC 2中使用
DropDownListFor
帮助程序实现
DropDownList
的最佳方法。这是一个多部分的问题

首先,将列表数据传递给视图的最佳方式是什么

  • 使用包含数据的
    SelectList
    属性在模型中传递列表
  • 通过
    ViewData
  • 如何在
    下拉列表中获取空值?我应该在创建时将其构建到
    选择列表中
    ,还是有其他方法告诉助手自动创建空值

    最后,如果出于某种原因出现服务器端错误,我需要使用
    下拉列表重新显示屏幕,我是否需要再次获取列表值以传递到视图模型中?这些数据在发布之间不会被维护(至少在我通过视图模型传递数据时不会),所以我打算再次获取它(它被缓存)。我说得对吗?

    (你已经知道了!)

  • 使用包含数据的SelectList属性在模型中传递列表
  • 是,在构建SelectList时添加它。(如果使用LINQ构建列表,Union可能会派上用场。)

    是的,一定要做,你是。

    部分回答:

  • IMHO的最佳方法是在
    视图模型中传递列表,如下所示:

    public SelectList Colors
    {
        get
        {
            // Getting a list of Colors from the database for example...
            List<Color> colors = GetColors().ToList();
    
            // Returning a SelectList to be used on the View side
            return new SelectList(colors, "Value", "Name");
        }
    }
    
  • 如果列表是
    ViewModel
    的一部分,则必须再次获取/填充该列表


  • 请看下面的博文。它可以给你一些提示:


    您可以执行以下操作:

    <%= Html.DropDownListFor((x => x.ListItems), Model.ListItems, "")%>
    
    x.ListItems),Model.ListItems,““”%>
    

    
    
    最后一个参数“optionLabel”生成一个空白列表项

    在本例中,您可以看到ListItems是模型的一个属性


    我还将视图强类型化为模型。

    您最好的选择是在控制器中创建一个选择列表-在此处使用我的扩展方法:

    使用与属性名称相同的键将其弹出到ViewData中:
    ViewData[“statusid”]=MySelectList


    然后只需使用
    Html.DropDownFor(x=>x.StatusID)
    就可以了。

    我发现处理一系列SelectListItems(而不是SelectList)更直观

    例如,这将从一系列客户对象创建一个
    IEnumerable
    ,您可以将这些对象传递给Html.DropDownListFor(…)帮助器。“Selected”属性可以选择在下拉列表中设置默认项

    var customers = ... // Get Customers
    var items = customers.Select(c => new SelectListItem
                                 {
                                     Selected = (c.Id == selectedCustomerId),
                                     Text = c.Email,
                                     Value = c.Id.ToString()
                                 }); 
    

    使用ViewData的问题在于,它使控制器更难测试。如果您将所有内容都保存在ViewModel中,那么您的测试会更好。实际上,这一点也没有什么不同-对于ViewModel,您必须使用spelunk ViewData.Model,否则您只需使用一个键来获取它。没什么区别。。。
    <%= Html.DropDownList("ListItems", Model.ListItems, "")%>
    
    var customers = ... // Get Customers
    var items = customers.Select(c => new SelectListItem
                                 {
                                     Selected = (c.Id == selectedCustomerId),
                                     Text = c.Email,
                                     Value = c.Id.ToString()
                                 });