在ASP.NET MVC 2中实现DropDownList的最佳方法?
我正在试图了解在ASP.NET MVC 2中使用在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 如何在下拉列表中获取空值?我应该在创建时将其构建到选择列表中,还是有其他方法告诉助手自动创建空值 最后,如果出于某种原因出现服务器端错误,我需要使用下拉列表重新显示屏幕,我是否需要再次获取列表值以传递到视图模型中?这些数据在发布之
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()
});