下拉列表作为对象列表的自定义编辑器

时间:2016-09-16 11:56:01

标签: c# asp.net-mvc asp.net-mvc-5

我有一个使用ModelMetadata显示所有对象属性的视图:

  @foreach (var property in ViewData.ModelMetadata.Properties)
    {
        <div class="form-group">
            @Html.Label(property.PropertyName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.Editor(property.PropertyName, new { htmlAttributes = new { @class = "form-control" }, Context = context })
                @Html.ValidationMessage(property.PropertyName, "", new { @class = "text-danger" })
            </div>
        </div>
    }

但是我的模型有下一个属性:

[Required]
public virtual User Owner { get; set; }

它应该显示用户列表的下拉列表,以便我可以选择一个。 我在Views\Shared\EditorTemplates\User.cshtml添加了以下编辑器模板:

@using Views.Projects
@model Models.Users.User
@{
    Layout = null;
    var context = (ProjectContext) ViewData["Context"];
    var elements = new SelectList(context.AvailableUsers, Model);
}

@Html.DropDownListFor(x => x, elements)

但是这些更改似乎并不适用 - 我选择的任何用户都没有保存在对象中并且验证失败(因为所有者== null,并且是必需的)

我如何使这项工作?

更新

生成原始HTML:

<div class="form-group"> 
    <label class="control-label col-md-2" for="Owner">Owner</label> 
    <div class="col-md-10"> 
        <select id="Owner" name="Owner">
            <option>User1</option> 
            <option>User2</option>  
            <option>User3</option>     
        </select> 
     <span class="field-validation-valid text-danger" data-valmsg-for="Owner" data-valmsg-replace="true"></span> 
     </div> 
</div>

1 个答案:

答案 0 :(得分:1)

您必须使用此功能在EditorTemplate User中生成DropDown:

@Html.DropDownListFor(x => x.Name, elements)

@Html.DropDownListFor(x => x.ID, elements)

Select字段的名称必须指向User的唯一属性之一(ID或名称无论如何)。如果字段名称只是User而不是User.IDUser.Name,则模型绑定器不知道要绑定到哪个用户属性。