模型绑定到列表MVC 4

是否存在将IList项绑定到视图的模式。 我似乎遇到了HttpPost的问题。 我知道菲尔哈克写了一篇很好的文章,但它已经过时了,他说他们可能会修复MVC 4。

如果我需要为每个项目显示一个表单,并为各种属性输入,我就是这样做的。 真的取决于我想要做的事情。

ViewModel看起来像这样:

public class MyViewModel { public List Persons{get;set;} } 

查看(当然有BeginForm):

 @model MyViewModel @for( int i = 0; i < Model.Persons.Count(); ++i) { @Html.HiddenFor(m => m.Persons[i].PersonId) @Html.EditorFor(m => m.Persons[i].FirstName) @Html.EditorFor(m => m.Persons[i].LastName) } 

行动:

 [HttpPost]public ViewResult(MyViewModel vm) { ... 

请注意,在回发时,只有具有可用输入的属性将具有值。 即,如果Person具有.SSN属性,则在post操作中将不可用,因为它不是表单中的字段。

请注意,MVC的模型绑定的工作方式,它只会查找连续的ID。 因此,在有条件地隐藏项目的情况下执行此类操作将导致它在第5项之后不绑定任何数据,因为一旦遇到ID中的间隙,它将停止绑定。 即使有10个人,你也只会获得回发中的前4个:

 @for( int i = 0; i < Model.Persons.Count(); ++i) { if(i != 4)//conditionally hide 5th item, { //but BUG occurs on postback, all items after 5th will not be bound to the the list @Html.HiddenFor(m => m.Persons[i].PersonId) @Html.EditorFor(m => m.Persons[i].FirstName) @Html.EditorFor(m => m.Persons[i].LastName) } } 

一个干净的解决方案可以创建一个通用类来处理列表,因此您不需要在每次需要时创建不同的类。

 public class ListModel { public List Items { get; set; } public ListModel(List list) { Items = list; } } 

当你返回视图时,你只需要做:

 List ListOfCustomClass = new List(); //Do as needed... return View(new ListModel(ListOfCustomClass)); 

然后在模型中定义列表:

 @model ListModel 

准备好了:

 @foreach(var element in Model.Items) { //do as needed... } 

〜控制器

 namespace ListBindingTest.Controllers { public class HomeController : Controller { // // GET: /Home/ public ActionResult Index() { List tmp = new List(); tmp.Add("one"); tmp.Add("two"); tmp.Add("Three"); return View(tmp); } [HttpPost] public ActionResult Send(IList input) { return View(input); } } } 

〜强类型索引视图

 @model IList @{ Layout = null; }     Index   
@using(Html.BeginForm("Send", "Home", "POST")) { @Html.EditorFor(x => x)
}

〜强类型发送视图

 @model IList @{ Layout = null; }     Send   
@foreach(var element in @Model) { @element
}

这就是你必须做的所有事情,将他的MyViewModel模型更改为IList。