ASP.NET MVC 3编辑器模板中的IEnumerable模型属性

|| 我有一个具有IEnumerable属性的模型(警告遵循伪代码)
public class PersonModel {
    public string Name { get; set; }
    public IEnumerable<AddressModel> Addresses { get; set; }
}

public class AddressModel {
    public string Name { get; set; }
}
我想在同一视图中显示“地址”子对象 Person.cshtml
@model PersonModel

<form>
    <h2>Person</h2>

    @Html.EditorFor(m=>m.Name)

    <ul>@Html.EditorFor(m=>m.Addresses)</ul>

</form>
EditorTemplate / AddressModel
@model AddressModel

<li>@Html.TextboxFor(m=>m.Name)</li>
很棒,一切正常 但是,作为一个git,我现在想开始使用Template Layouts以标准类型的方式包装所有属性 因此,我创建了一个string.cshtml和list.cshtml来做到这一点,其中_Control.cshtml用于布局 EditorTemplates / _Control.cshtml
<div>
    @Html.Label(string.Empty)
    <div class=\"input\">
        @RenderBody()                    

        @Html.ValidationMessage(string.Empty)
    </div>
</div>
EditorTemplates / string.cshtml
@model string
@{    
    Layout = \"_Control.cshtml\";
}
@Html.TextBox(string.Empty, Model)
(到目前为止,是的!但是请稍等。哦,不。) 这是麻烦
<ul>@Html.EditorFor(m=>m.Addresses)</ul>
从主视图(见上文)变为
@Html.EditorFor(m=>m.Addresses, \"List\")
EditorTemplates / list.cshtml
@model IEnumerable<object>
@{    
    Layout = \"_Control.cshtml\";
}
<ul>
    @foreach(var item in Model){
        @Html.EditorFor(m => item)
    }
</ul>
这会错误地呈现ID和名称,例如Addresses_item_Name,其中不包含ID,因此请使用for循环添加ID
@for (var i = 0; i < Model.Count();i++ ) {
    @Html.EditorFor(m => Model.ElementAt(i))
}
由于MVC表达式帮助器不允许使用数组,因此它会爆炸,但Addresses必须为IEnumerable <>,因为EF4.1在子查询中即不支持.ToArray。
var model = (from p in DataContext.People
             where p.Id = 1
             select new PersonModel {
                 Name = p.Name,
                 Addresses = (from a in p.Addresses
                              select new AddressModel {
                                  Name = a.Name 
                              }).ToArray() // **NOT SUPPORTED**
             }).FirstOrDefault();
有人反对吗? 有标准的方法吗? 这可行,但是对吗? EditorTemplates / list.cshtml
@model IEnumerable<object>
@{    
    Layout = \"_Control.cshtml\";
    var prefix = ViewData.TemplateInfo.HtmlFieldPrefix;
}
<ul>
    @for (var i = 0; i < Model.Count();i++ ) {
        var item = Model.ElementAt(i);
        ViewData.TemplateInfo.HtmlFieldPrefix = string.Format(\"{0}[{1}]\",prefix, i);
        @Html.EditorFor(m => item, null, string.Empty)
    }
</ul>
所需的结构是
<form>
    <control>
       Person Name Control Elements
    <control>

    <control>
       Address List Control Elements
    <control>
</form>
    
已邀请:
EditorFor不允许放入任何put属性类型,而不允许使用方法,这就是它快要死的原因。 我的建议是将模板创建为单个地址项,然后使用外部循环编辑每个地址,或者使用editorformodel为您完成此操作。 硅     

要回复问题请先登录注册