2012-11-06 146 views
2

如果我有这样的一个型号:MVC-模型绑定的复杂类型

public class Search 
{ 
    public int Id { get; set; } 
    public string UserDefinedName { get; set; } 
    public SearchAge Age { get; set; } 
    public virtual ICollection<SearchBachelors> Bachelors { get; set; } 
} 

我渲染年龄财产局部视图动态使用这样的事情:

@Ajax.ActionLink("Age", "SearchAge", new AjaxOptions { UpdateTargetId = "search-stage", InsertionMode = InsertionMode.InsertAfter }) 

那部分看起来像这样:

@model HireWireWeb.Models.Campaign.Search.Search 
<div> 
    @Html.DropDownListFor(m => m.Age.MaximumAge, HireWireWeb.Models.Constants.SLIST_AGE_LIST) 
    @Html.DropDownListFor(m => m.Age.MinimumAge, HireWireWeb.Models.Constants.SLIST_AGE_LIST) 
</div> 

(请注意,我没有通过“SearchAge”作为模型在这里,而是它的父母,“Se拱“,因为它只是如何我可以得到在表单提交,在呈现的”搜索“形式下发布的”SearchAge“值) - According to this Answer

我的问题是,我该如何做同样的事情, Bachelors“财产,因为这是一个ICollection?

回答

1

MVC的标准模型绑定系统需要能够创建“绑定”类型。它无法创建界面,因此解决此问题的最简单方法是将类型更改为List<SearchBachelors>。然后,您可以有一个局部视图是这样的:

@model HireWireWeb.Models.Campaign.Search.Search 
<div> 
    @for(var i = 0;i<Model.Bachelors.Count;++i) 
    { 
     @Html.TextBoxFor(m => m.Bachelors[i].Name) 
    } 
</div> 

...渲染输出会以这样的方式被命名为给你当使用元素的索引列表中的绑定到你的List财产提交表格。

+0

这将工作。但我使用Ajax.ActionLink渲染这些部分视图,而不是一次全部渲染。如果其中一个已经被渲染,并且数据被输入,重新渲染将会清除该数据。 – ncabral

+1

我有一个保存呈现文本框的增量值的会话变量。这样我避免了循环,当我想要的时候仍然可以渲染一个物品。谢谢。这有帮助! – ncabral

+0

不错的一个,很高兴有帮助:) –