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

时间:2010-03-07 22:39:46

标签: asp.net asp.net-mvc asp.net-mvc-2 drop-down-menu

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

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

  1. 使用包含数据的SelectList属性
  2. 传递模型中的列表
  3. 通过ViewData
  4. 传递列表

    如何在DropDownList中获取空白值?我应该在创建时将其构建到SelectList中,还是有其他方法告诉帮助者自动创建空值?

    最后,如果由于某种原因出现服务器端错误而我需要使用DropDownList重新显示屏幕,是否需要再次获取列表值以传递到视图模型?帖子之间没有维护这些数据(至少当我通过我的视图模型传递它时),所以我只是再次获取它(它被缓存)。我能正确地解决这个问题吗?

5 个答案:

答案 0 :(得分:9)

最好的办法是在Controller中创建一个SelectList - 在这里使用我的扩展方法: http://blog.wekeroad.com/2010/01/20/my-favorite-helpers-for-aspnet-mvc

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

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

答案 1 :(得分:3)

部分回答:

  1. 恕我直言的最佳方式是通过ViewModel这样的列表:

    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");
        }
    }
    
  2. 要获得像( - 选择颜色 - )这样的空白或默认选项,您可以在视图方面执行此操作:

    @Html.DropDownListFor(m => m.Color, Model.Colors, "-- Pick a color --")
    
  3. 如果列表是ViewModel的一部分,则必须再次获取/填充列表。


  4. 查看以下博客文章。它可以给你一些提示:

    Drop-down Lists and ASP.NET MVC

答案 2 :(得分:2)

您可以执行以下操作:

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

<%= Html.DropDownList("ListItems", Model.ListItems, "")%>

最后一个参数'optionLabel'创建一个空白列表项

在这种情况下,您可以看到ListItems是模型的属性。

我也强烈地将视图输入到模型中。

答案 3 :(得分:0)

(你已经知道了!)

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

    是的,做的,是的。

答案 4 :(得分:0)

我发现使用一系列SelectListItems(而不是SelectList)更直观。

例如,这将从一系列客户对象创建一个IEnumerable<SelectListItem>,您可以将其传递给Html.DropDownListFor(...)帮助程序。 “已选择”属性可选择在下拉列表中设置默认项目。

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