是否有将 IList 项目绑定到视图的模式。我似乎对 HttpPost 有问题。我知道 Phil Haack 写了一篇不错的文章,但它已经过时了,他说他们可能会修复 MVC 4。
问问题
117002 次
3 回答
58
如果我需要为每个项目显示一个表单并输入各种属性,我就是这样做的。真的取决于我想要做什么。
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 属性,它在 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)
}
}
于 2013-03-13T02:25:16.747 回答
11
一个干净的解决方案可以是创建一个通用类来处理列表,因此您无需在每次需要时都创建不同的类。
public class ListModel<T>
{
public List<T> Items { get; set; }
public ListModel(List<T> list) {
Items = list;
}
}
当您返回视图时,您只需要简单地执行以下操作:
List<customClass> ListOfCustomClass = new List<customClass>();
//Do as needed...
return View(new ListModel<customClass>(ListOfCustomClass));
然后在模型中定义列表:
@model ListModel<customClass>
准备出发:
@foreach(var element in Model.Items) {
//do as needed...
}
于 2014-04-16T19:55:44.960 回答
5
~控制器
namespace ListBindingTest.Controllers
{
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
List<String> tmp = new List<String>();
tmp.Add("one");
tmp.Add("two");
tmp.Add("Three");
return View(tmp);
}
[HttpPost]
public ActionResult Send(IList<String> input)
{
return View(input);
}
}
}
~ 强类型索引视图
@model IList<String>
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
@using(Html.BeginForm("Send", "Home", "POST"))
{
@Html.EditorFor(x => x)
<br />
<input type="submit" value="Send" />
}
</div>
</body>
</html>
~ 强类型发送视图
@model IList<String>
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Send</title>
</head>
<body>
<div>
@foreach(var element in @Model)
{
@element
<br />
}
</div>
</body>
</html>
这就是你要做的所有事情,将他的 MyViewModel 模型更改为 IList。
于 2013-03-13T03:28:41.363 回答