2011-04-25 135 views
0

这个问题相当有趣: 如何将集合传递给控制器​​时,我有创建模板的详细类型视图。 这是我的ViewModel:asp.net mvc如何将集合传递给控制器​​

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

你看着这个:[Model Binding To List](http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx) – R0MANARMY 2011-04-25 22:33:41

回答

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. 
} 

,并宣布你的POST方法如下

[HttpPost] 
public ActionResult OnPostBack(<modeltype> arg) 
{ 
    if(ModelState.IsValid) 
    { 
     // action logic, etc. 

那么就可以成功。 MVC将定义生成的文本框,以便能够在回发时将它们与模型链接起来。我相信它所做的是在文本框中声明name属性,例如Phones_1_Phone。您可以通过在浏览器中查看生成的HTML来进行检查。

顺便说一句,还有其他方法可以使这个工作。我相信,您可以使用密钥,使用字典<>而不是列表<>和稀疏数组。当然,你会想要做的不仅仅是在你的页面上生成一堆文本框 - 一些标签会很好:)。

我发现这个以及更多的很棒的教程是来自Apress的Steven Sanderson的Pro ASP.NET MVC 2框架。几个月前我开始对MVC一无所知,现在我对它很满意(尽管还不是专家)。

哎呀,忘了提及一些重要的东西:我的例子使用MVC3和它的Razor视图引擎。如果你不使用MVC3,你需要将它翻译成MVC2语法。但是你应该给MVC3一下,我发现它比它的前辈更直观。更不用说“罗嗦”了。

+0

谢谢,但我了解这种方法。问题是我的页面不是用于编辑的,而是用于创建的。我不知道会有多少文本框。例如,我有一个手机领域,如果用户想再添加一个,他点击按钮“添加”,然后出现一个字段。 – Alex 2011-04-26 08:50:13

相关问题