使用初始值填充DropDownListFor

时间:2015-11-19 21:05:44

标签: c# asp.net-mvc razor

我尝试在我的视图中填充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,则所选值应为空),但我的结果是所有下拉框都有一个初始值空值(当我点击其中一个时,您会看到填充下拉列表。)

1 个答案:

答案 0 :(得分:0)

首先,当您提交时,这不会绑定。您无法在foreach循环中生成表单控件,因为它会生成与您的模型无关的重复name属性(由于重复的id属性,它还会生成无效的html。如果您检查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

类型使用自定义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)