asp.net mvc如何将集合传递给控制器

时间:2011-04-25 22:26:28

标签: asp.net-mvc collections

这个问题相当有趣: 当我有创建模板的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; } 
    } 

因此,我想创建一个用于创建电话对象的视图,该视图包含电话运营商和电话号码字段。但是,有趣的是我希望从手机对象中获取一个集合并将它们传递给控制器​​。有什么想法吗?

1 个答案:

答案 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看一下,我发现它比它的前辈更直观。更不用说“罗嗦”了。