我有一个使用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>
答案 0 :(得分:1)
您必须使用此功能在EditorTemplate
User
中生成DropDown:
@Html.DropDownListFor(x => x.Name, elements)
或
@Html.DropDownListFor(x => x.ID, elements)
Select
字段的名称必须指向User
的唯一属性之一(ID或名称无论如何)。如果字段名称只是User
而不是User.ID
或User.Name
,则模型绑定器不知道要绑定到哪个用户属性。