Asp.net mvc 3 mvc razor中的嵌套编辑模板

Asp.net mvc 3 mvc razor中的嵌套编辑模板,asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,这个问题我见过很多种说法,但答案总是变成“你不需要那样做”,而且从来没有答案 我有一个关于产品的属性列表,我想在一个无序列表中显示该列表,并通过复选框选择特定属性 在我的模型中: public List<ProductAttribute> ProductAttributes {get;set;} 但现在我没有我想要的无序列表。我可以将该模板视为一个项目模板,并将行项目标记嵌入到该模板中,但如果有一个模板与另一个模板紧密耦合,这似乎很难闻 有什么想法吗 提前感谢, Tal模型。Pro

这个问题我见过很多种说法,但答案总是变成“你不需要那样做”,而且从来没有答案

我有一个关于产品的属性列表,我想在一个无序列表中显示该列表,并通过复选框选择特定属性

在我的模型中:

public List<ProductAttribute> ProductAttributes {get;set;}
但现在我没有我想要的无序列表。我可以将该模板视为一个项目模板,并将行项目标记嵌入到该模板中,但如果有一个模板与另一个模板紧密耦合,这似乎很难闻

有什么想法吗

提前感谢,


Tal

模型。ProductAttributes
为空,因为DefaultModelBinder无法将每个DisplayLocationAttribute引用回模型的ProductAttribute属性。最简单的解决方案是将列表元素命名为数组,例如,每个IsSelected元素都以样式
ProductAttributes[n].IsSelected
命名

将以下内容添加到
ProductAttributeSelectorList.cshtml

@model List<Models.DisplayLocationAttribute>
@{
    var i = 0;
}
<div class="AttributeSelector">
    <ul>
    @foreach (var item in Model)
    {     
        this.ViewData.TemplateInfo.HtmlFieldPrefix = "ProductAttributes[" + 
            i.ToString() + "]";
        i++;
        <li>
            @Html.EditorFor(_ => item, "EditLocationAttributeList")
        </li> 
    }
    </ul>
</div>
@{
    this.ViewData.TemplateInfo.HtmlFieldPrefix = ""; 
}
@型号列表
@{
var i=0;
}
    @foreach(模型中的var项目) { this.ViewData.TemplateInfo.HtmlFieldPrefix=“ProductAttributes[”+ i、 ToString()+“]”; i++;
  • @EditorFor(=>item,“EditLocationAttributeList”)
  • }
@{ this.ViewData.TemplateInfo.HtmlFieldPrefix=“”; }

这将为您提供一个索引数组,DefaultModelBinder将能够将其与ProductAttributes关联。但是,它对名称
ProductAttributes
建立了硬依赖关系。您可以通过几种方法绕过硬依赖关系,例如在ViewBag中传递属性名。

这就成功了,但我不清楚发生了什么。所以我建立了一个属性数组,我只是提供了一个魔法可以使用的数组吗?是的,或多或少。欲知更多详情,请阅读Phil Haack的帖子
 @model List<Models.DisplayLocationAttribute>
 <div class="AttributeSelector">
     <ul>
        @foreach (var item in Model)
           {     
           <li>
             @Html.EditorFor(_ => item, "EditLocationAttributeList")
           </li> 
           }
    </ul>
</div>
@model Models.DisplayLocationAttribute
@Html.HiddenFor(m => m.Id)
@Html.CheckBoxFor(m => m.IsSelected)
<a href="#" alt="@Model.Description" >@Model.Name</a>
 @Html.EditorFor(m => m.ProductAttributes, "EditLocationAttributeList")
@model List<Models.DisplayLocationAttribute>
@{
    var i = 0;
}
<div class="AttributeSelector">
    <ul>
    @foreach (var item in Model)
    {     
        this.ViewData.TemplateInfo.HtmlFieldPrefix = "ProductAttributes[" + 
            i.ToString() + "]";
        i++;
        <li>
            @Html.EditorFor(_ => item, "EditLocationAttributeList")
        </li> 
    }
    </ul>
</div>
@{
    this.ViewData.TemplateInfo.HtmlFieldPrefix = ""; 
}