问题描述
是否有将项目的 IList 绑定到视图的模式.我似乎对 HttpPost 有问题.我知道 Phil Haack 写了一篇不错的文章,但它已经过时了,他说他们可能会修复 MVC 4.
Is there a pattern to bind an IList of items to the view. I seem to be having issues with the HttpPost. I know Phil Haack wrote a nice article but it is dated and he said they might have a fix with MVC 4.
推荐答案
如果我需要为每个项目显示一个表单,并为各种属性输入一个表单,我就是这样做的.不过这真的取决于我想要做什么.
This is how I do it if I need a form displayed for each item, and inputs for various properties. Really depends on what I'm trying to do though.
ViewModel 看起来像这样:
ViewModel looks like this:
public class MyViewModel
{
public List<Person> Persons{get;set;}
}
查看(当然是使用BeginForm):
View(with BeginForm of course):
@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 操作中将不可用,因为它不是表单中的一个字段.
Note that on post back only properties which had inputs available will have values. I.e., if Person had a .SSN property, it would not be available in the post action because it wasn't a field in the form.
请注意 MVC 模型绑定的工作方式,它只会查找连续的 ID.因此,在有条件地隐藏项目的情况下执行此类操作将导致它在第 5 个项目之后不绑定任何数据,因为一旦遇到 ID 中的间隙,它将停止绑定.即使有 10 个人,您也只能在回发中获得前 4 个:
Note that the way MVC's model binding works, it will only look for consecutive ID's. So doing something like this where you conditionally hide an item will cause it to not bind any data after the 5th item, because once it encounters a gap in the IDs, it will stop binding. Even if there were 10 people, you would only get the first 4 on the postback:
@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)
}
}
这篇关于模型绑定到列表 MVC 4的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!