2010-01-17 104 views
2

我试图使用的SelectList我的意见之一,它只是不正确填充。它获得了适当数量的条目(4),但它们都是System.Web.Mvc.SelectListItem。我在代码上启动了调试器,发现有一些奇怪的现象。我一定在做错事,但我不太明白。从视图模型我的ASP.NET MVC SelectList有什么问题?

代码:

public SelectList DeviceTypes {get; private set;} 
.... 
var device_types = DataTableHelpers.DeviceTypes(); 
IEnumerable<SelectListItem> sl = device_types.Select(
         dt => new SelectListItem { Selected = (dt.DeviceType == 1), 
         Text = dt.Description, 
         Value = dt.DeviceType.ToString() }).ToList(); 
DeviceTypes = new SelectList(sl); 

和代码视图:

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

所以,当我在调试器看看这个,对SL的IEnumerable是越来越正确建立。我可以看到里面的所有4个元素,具有正确的Text和Value属性值。但是,一旦我调用SelectList构造函数,如果我展开它所包含的IEnumerable,则会看到它有4个条目,但其中的所有数据都已丢失。文本设置为System.Web.Mvc.SelectListItem,和值为null

我试着将ToList()调用更改为ToArray(),并将其完全删除。这并没有改变行为。

我在这里做错了什么?

回答

4

编辑:抓抓我的第一个答案。

你应该传递的IEnumerable列表,如果项目视图,而不是试图在控制器来构建一个HTML项目。

代码控制器:

public IEnumberable<YourModel> DeviceTypes {get; internal set;} 
.... 
DeviceTypes = DataTableHelpers.DeviceTypes(); 

代码查看:

<%= Html.DropDownList("Type", from dt in Model.DeviceTypes 
           select new SelectListItem 
           { 
            Text = dt.Description, 
            Value = dt.DeviceType.ToString(), 
            Selected = dt.DeviceType == 1 
           }) %> 
+0

没错,这做到了,谢谢。我想我也明白我现在做错了什么。 – 2010-01-17 19:28:26

+0

这是一个老旧的函数式答案,但请**,绝对不要**直接向视图中写入Linq请求!好的做法是声明一个'INT SelectedValue'和模型中的一个'的IEnumerable <> YourEnumerableProperty'属性,然后在控制器填充它,最后用'@ Html.DropDownListFor(M => m.SelectedValue,新的SelectList( Model.YourEnumerableProperty,“价值”,“文本”)'意见是不应该持有逻辑企业。 – AlexB 2017-12-11 21:29:39

+0

视图可以包含逻辑,它只是需要显示逻辑,而不是业务逻辑。 – 2017-12-21 18:50:42