在 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<SelectListItem>
,您可以将其传递给 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 的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章