2015-11-19 166 views
0

我尝试在我的视图中填充DropDownListFor,但我似乎并没有得到它的工作。填充DropDownListFor与初始值

我的模型

public class Warehouse 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 
    public string LocationCode { get; set; } 
    public IEnumerable<SelectListItem> LocationList 
    { 
     get 
     { 
      DbEntities db = new DbEntities(); 

      var List = new SelectList(db.Locations, "LocID".Trim(), "Desc".Trim()); 
      return List; 
     } 
     set { } 
    } 
} 

在我的ViewPage我有以下代码

@model IEnumerable<MyApp.Models.Warehouse> 

<!-- some html --> 
@foreach(var s in Model) 
{ 
    @Html.DropDownListFor(p => s.LocationCode, s.LocationList, "", new { @class = "form-control" }) 
} 

我想通过设置p => s.LocationCode我设置的下拉列表中初始选定值(选择的值应该是空的,如果s.LocationCode == null),但我的结果是所有的下拉框都有一个初始的空值(当我点击其中的一个时,你会看到下拉列表被填充)。

+0

有在SO太多类似问题。看看这个,例如:http://stackoverflow.com/questions/16034454/create-many-dropdownlistfor-in-foreach-loop – ataravati

回答

0

首先,这不会绑定当您提交。您不能生成表单控件在foreach循环,因为它会产生重复这有你的模型没有关系(它也产生是因为重复id属性无效的HTML name属性。如果你检查HTML,你会看到它的

<select name="s.LocationCode" ... > 
<select name="s.LocationCode" ... > 

在那里,因为它需要是

<select name="[0].LocationCode" ... > 
<select name="[1].LocationCode" ... > 

你的循环必须

@model List<MyApp.Models.Warehouse> // must implement IList<T> 
.... 
@for(int i = 0; i < Model.Count; i++) 
{ 
    @Html.DropDownListFor(m => m[i].LocationCode, Model[i].LocationList, ...) 

另一种方法是使用定制EditorTemplate为typeof运算Warehouse

/Views/Shared/EditorTemplates/Warehouse.cshtml

@model Warehouse 
.... 
@Html.DropDownListFor(m => m.LocationCode, Model.LocationList, ...) 

,然后在主视图

@model IEnumerable<MyApp.Models.Warehouse> // can be Enumerable<T> 
.... 
@Html.EditorFor(m => m) 
+0

我试过你上面描述的,但是我不能使用SelectList (Model.LocationList,因为它说我的模型没有包含一个定义。 – kwv84

+0

糟糕 - 我刚刚意识到你的SelectList实际上在模型内部(不寻常),所以在这种情况下它需要只是'@ Html.DropDownListFor(m = > m [i] .LocationCode,Model [i] .LocationList)' - 生成一个新的'SelectList'不是必须的。主要问题是你不正确地使用'foreach'循环,它不会给出双向模型绑定 –

+0

我也会考虑改变你这样做的方式,在这样的模型中访问数据库并不是一个好的做法,除非你使用DI –