2015-11-19 173 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 –