31

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

4

3 回答 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 回答