模型绑定到列表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。