2012-10-22 82 views
1

如果我的ViewModel有一些子属性:子窗体集合处理

public class MyViewModel 
{ 
    public MyFormViewModel Form {get;set;} 
} 

,我使该物业的形式,然后我就可以有以下的ActionResult:

[HttpPost] 
public ActionResult SomeAction(MyFormViewModel form) 
{ 
    ... 
} 

和DefaultModelBinder填充表单属性(如果ViewModel的属性名称等于操作参数名称)。

但是,如果MyViewModel包含由索引呈现的IList<MyFormViewModel>,我应该如何命名操作参数:@Html.EditorFor(x => x.Forms[index])

+0

你能描述它是如何在商业中?它将如何在界面? –

+0

@KirillBestemyanov,例如可能有一个页面上的项目列表,我想为每个项目提供编辑窗体 – SiberianGuy

+0

通常的解决方案是编辑和发布项目一个接一个。但是如果你想将它作为列表发布,你需要阅读以下内容:http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx –

回答

1

如果你

其实并不需要张贴的名单,我希望能够张贴列表

的一个 形式那么就不要使用@Html.EditorFor(x => x.Forms[index])。 使用

var element = x.Forms[index] 
@Html.EditorFor(x => element) 

您的操作参数的名称在这种情况下无关紧要。

+0

问题是我应该如何调用动作参数名称(窗体,窗体0等),以便DefaultModelBinder识别它 – SiberianGuy

+1

然后答案是“没有那个名字”。如果您使用DefaultModelBinder并且您的GET参数名称就像Forms [0] .Property1等 – Shaddix

1

我从来没有做过类似的事情,但如果可能的话(我不知道它是否可以),在这里你可以找到一个古老但很好的starting point。 希望能提供帮助。

3

试试这个:

控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var myViewModel = new MyViewModel() 
      { 
       Form = new MyFormViewModel {Name = "Header"}, 
       FormViewModels = new List<MyFormViewModel>() 
            { 
             new MyFormViewModel() {Name = "First"}, 
             new MyFormViewModel() {Name = "Secound"} 
            } 
      }; 

     return View(model: myViewModel); 
    } 
    [HttpPost] 
    public ActionResult Index(FormCollection collection, List<MyFormViewModel> FormViewModels, MyViewModel myView) 
    { 
     return View(); 
    } 

} 

型号:

public class MyViewModel 
{ 
    public MyFormViewModel Form { get; set; } 
    public IList<MyFormViewModel> FormViewModels { get; set; } 
} 

public class MyFormViewModel 
{ 
    public string Name { get; set; } 
} 

查看:

@model MvcChat.Models.MyViewModel 
@{ 
    ViewBag.Title = "Home Page"; 
} 

@using(Html.BeginForm()) 
{ 
    @Html.EditorFor(model=>model.Form.Name) 

    for (int i = 0; i < Model.FormViewModels.Count; i++) 
    { 
     @Html.EditorFor(x => x.FormViewModels[i]) 
    } 
    <input type="submit" value="go"/> 
} 

结果应该是这样的(http://i.stack.imgur.com/t0Je0.png):

result