这个问题相当有趣: 当我有创建模板的strondly类型视图时,如何将集合传递给控制器。 这是我的ViewModel:
public class AgencyOfficiesItem
{
public string Address { get; set; }
public List<PhoneItem> Phones { get; set; }
public List<SelectListItem> CitiesList { get; set; }
}
public class PhoneItem {
public string Phone { get; set; }
public string PhoneOperator { get; set; }
}
因此,我想创建一个用于创建电话对象的视图,该视图包含电话运营商和电话号码字段。但是,有趣的是我希望从手机对象中获取一个集合并将它们传递给控制器。有什么想法吗?
答案 0 :(得分:2)
如果你继续在你看来做这样的事情:
@using(Html.BeginForm... // I'm doing this from memory, check the arguments
{
for( int idx = 0; idx < Model.Phones.Count; idx++ )
{
@Html.EditorFor(m => m.Model.Phones[idx].Phone)
@Html.EditorFor(m => m.Model.Phones[idx].PhoneOperator)
}
// similar for cities, other model properties, etc.
}
并声明你的帖子方法如下
[HttpPost]
public ActionResult OnPostBack( <modeltype> arg )
{
if( ModelState.IsValid )
{
// action logic, etc.
然后一切都应该好。 MVC将以一种方式定义生成的文本框,以便能够在回发时将它们与模型链接起来。我相信它所做的是在文本框中声明name属性,例如,Phones_1_Phone。您可以在浏览器中查看生成的HTML进行检查。
顺便说一下,还有其他方法可以让它发挥作用。你可以使用密钥,使用Dictionary&lt;&gt;我相信,而不是List&lt;&gt;和稀疏数组。当然,除了在页面上生成一堆文本框之外,你还需要做更多的事情 - 有些标签会很好看:)。
我发现一个很棒的教程就是来自Apress的Steven Sanderson的Pro ASP.NET MVC 2框架。几个月前我开始对MVC一无所知,现在我对它很满意(虽然还不是专家)。
哎呀,忘了提一些重要的东西:我的例子使用了MVC3及其Razor视图引擎。如果您不使用MVC3,则需要将其转换为MVC2语法。但你应该给MVC3看一下,我发现它比它的前辈更直观。更不用说“罗嗦”了。