一尘不染

模型绑定到列表MVC 4

c#

是否存在将项目的IList绑定到视图的模式。我似乎在HttpPost上遇到问题。我知道Phil
Haack写了一篇不错的文章,但是它已经过时了,他说他们可能对MVC 4有一个修复。


阅读 237

收藏
2020-05-19

共1个答案

一尘不染

如果需要为每个项目显示一个表单,并为各种属性输入内容,这就是我的方法。确实取决于我要做什么。

ViewModel看起来像这样:

public class MyViewModel
{
   public List<Person> 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属性,则它在表单中将不可用,因为它不是表单中的字段。

请注意,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)           
    }
}
2020-05-19