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

Asp.net mvc 3 ASP.NET MVC 3编辑器模板中的IEnumerable模型属性,asp.net-mvc-3,ienumerable,editortemplates,mvc-editor-templates,Asp.net Mvc 3,Ienumerable,Editortemplates,Mvc Editor Templates,我有一个具有IEnumerable属性的模型(下面是警告伪代码) (到目前为止是的!但是等等..哦不..) 麻烦来了 <ul>@Html.EditorFor(m=>m.Addresses)</ul> EditorTemplates/list.cshtml @model PersonModel <form> <h2>Person</h2> @Html.EditorFor(m=>m.Name) &

我有一个具有IEnumerable属性的模型(下面是警告伪代码)

(到目前为止是的!但是等等..哦不..)

麻烦来了

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

@model PersonModel

<form>
    <h2>Person</h2>

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

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

</form>
@model AddressModel

<li>@Html.TextboxFor(m=>m.Name)</li>
<div>
    @Html.Label(string.Empty)
    <div class="input">
        @RenderBody()                    

        @Html.ValidationMessage(string.Empty)
    </div>
</div>
@model string
@{    
    Layout = "_Control.cshtml";
}
@Html.TextBox(string.Empty, Model)
@model IEnumerable<object>
@{    
    Layout = "_Control.cshtml";
}
<ul>
    @foreach(var item in Model){
        @Html.EditorFor(m => item)
    }
</ul>
@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>
有人反对这个吗? 有没有标准的方法

这是可行的,但它是正确的吗

EditorTemplates/list.cshtml

@model PersonModel

<form>
    <h2>Person</h2>

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

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

</form>
@model AddressModel

<li>@Html.TextboxFor(m=>m.Name)</li>
<div>
    @Html.Label(string.Empty)
    <div class="input">
        @RenderBody()                    

        @Html.ValidationMessage(string.Empty)
    </div>
</div>
@model string
@{    
    Layout = "_Control.cshtml";
}
@Html.TextBox(string.Empty, Model)
@model IEnumerable<object>
@{    
    Layout = "_Control.cshtml";
}
<ul>
    @foreach(var item in Model){
        @Html.EditorFor(m => item)
    }
</ul>
@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>
@model IEnumerable
@{    
Layout=“_Control.cshtml”;
var prefix=ViewData.TemplateInfo.HtmlFieldPrefix;
}
    @对于(var i=0;iitem,null,string.Empty) }
所需的结构是

<form>
    <control>
       Person Name Control Elements
    <control>

    <control>
       Address List Control Elements
    <control>
</form>

人名控制元素
地址列表控制元素

EditorFor不允许任何put属性类型,而不允许任何方法,这就是它即将消亡的原因

我的建议是将模板创建为单个地址项,然后使用外部循环来编辑每个地址项,或者使用editorformodel来为您进行编辑


Si

为什么需要此List.cshtml模板?无法在其中看到任何附加值,尤其是您在其中所做的只是为集合的每个元素编写一个循环并调用另一个编辑器模板,默认情况下,该模板已自动完成。允许使用该模板layout@AnthonyJohnston,但是您已经在
string.cshtml
模板中包含了模板布局。或者你想要一个不同的布局?地址作为一个整体被包装,而不是每个项目,addressmodel.cshtml应该是textboxfor,我会修正这一点,在我看来,你最好做一个foreach并分别递增一个计数器变量。Count()和ElementAt()方法可能非常昂贵(取决于基础列表),但不管怎样,简单地枚举(foreach)也同样有效。