2011-08-24 79 views
2

我已经看到这个问题的很多版本,但答案总是变成“你不需要那样做”,并且永远不会有答案。mvc razor中的嵌套编辑模板

我有一个关于产品的属性列表,我想在无序列表中显示带有复选框的特定属性。

在我的模型:

public List<ProductAttribute> ProductAttributes {get;set;} 

在我Create.cshtml:

<div Class="ProductAttributes"> 
     @Html.EditorFor(m => m.ProductAttributes, "ProductAttributeSelectorList") 
    </div> 

在我ProductAttributeSelectorList.cshtml:

@model List<Models.DisplayLocationAttribute> 
<div class="AttributeSelector"> 
    <ul> 
     @foreach (var item in Model) 
      {  
      <li> 
      @Html.EditorFor(_ => item, "EditLocationAttributeList") 
      </li> 
      } 
    </ul> 
</div> 

最后,在我的EditLocationAttributeList.cshtml

@model Models.DisplayLocationAttribute 
@Html.HiddenFor(m => m.Id) 
@Html.CheckBoxFor(m => m.IsSelected) 
<a href="#" alt="@Model.Description" >@Model.Name</a> 

这一切都完美地显示在页面上,我可以使用CSS来设计它的样式,但是当提交返回时,我的model.ProductAttributes集合为null。

我知道我可以直接绑定到EditLocationAttributeList,它会显示并返回一个人口model.ProductAttributes如果我用这个:

@Html.EditorFor(m => m.ProductAttributes, "EditLocationAttributeList") 

,但现在我没有到无序列表,我想有。我可以像处理项目模板一样对待模板,并将行项目标记嵌入到该模板中,但看起来很臭,并且模板与另一个模板紧密耦合。

任何想法?

由于提前,

塔尔

回答

2

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

这会给你一个索引数组,其中DefaultModelBinder就能关联到ProductAttributes。但是,它对名称ProductAttributes产生了很大的依赖性。您可以通过几种方法绕过硬依赖项,例如在ViewBag中传递属性名称。

+0

这样做的窍门,我不清楚发生了什么。所以我建立了一系列的属性,我只是提供一个魔术可以使用的数组呢? – TalMcMahon

+0

是的,或多或少。欲了解更多详情,请阅读Phil Haack的帖子http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx – counsellorben