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 = "";
}