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

Posted

技术标签:

【中文标题】在 ASP.NET MVC 2 中实现 DropDownList 的最佳方式?【英文标题】:Best way of implementing DropDownList in ASP.NET MVC 2? 【发布时间】:2010-03-07 22:39:45 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

使用 ViewData 的麻烦在于它使你的控制器更难测试。如果您将所有内容都保留在 ViewModel 中,您的测试会更好。 实际上并没有什么不同 - 使用 ViewModel 你必须探索 ViewData.Model,否则你只需用密钥请求它。完全没有区别...【参考方案2】:

部分回答:

    恕我直言,最好的方法是像这样传递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");
        
    
    

    要获得一个空白或默认选项,如 ( -- Pick a color -- ),您可以在视图侧执行此操作:

    @Html.DropDownListFor(m => m.Color, Model.Colors, "-- Pick a color --")
    

    如果列表是ViewModel 的一部分,您必须再次获取/填充列表。


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

Drop-down Lists and ASP.NET MVC

【讨论】:

【参考方案3】:

你可以这样做:

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

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

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

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

我也将视图设为模型的强类型。

【讨论】:

【参考方案4】:

(你已经知道了!)

    使用包含数据的 SelectList 属性传递模型中的列表

是的,在构建 SelectList 时添加它。 (如果您使用 LINQ 构建列表,Union 可能会派上用场。)

是的,你是。

【讨论】:

【参考方案5】:

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

例如,这将从一系列客户对象创建一个IEnumerable&lt;SelectListItem&gt;,您可以将其传递给 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()
                             ); 

【讨论】:

以上是关于在 ASP.NET MVC 2 中实现 DropDownList 的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET MVC 中实现“记住我”功能

在 asp.net MVC 中实现超级用户功能?

在 ASP.NET MVC 中实现配置文件提供程序

如何在 ASP.NET MVC 5 和 WEB API 2 中实现 oauth2 服务器 [关闭]

如何在 ASP.Net MVC 中实现视频文件流式传输?

关于在 asp.net mvc 中实现忘记密码功能的一些问题