2012-10-22 133 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