首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定到列表的模型MVC 4

绑定到列表的模型MVC 4
EN

Stack Overflow用户
提问于 2013-03-13 10:06:48
回答 3查看 115.8K关注 0票数 31

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-13 10:25:17

如果我需要为每个项目显示一个表单,并为各种属性输入,我就是这样做的。这真的取决于我想做什么。

ViewModel看起来像这样:

代码语言:javascript
复制
public class MyViewModel
{
   public List<Person> Persons{get;set;}
}

视图(当然是使用BeginForm ):

代码语言:javascript
复制
@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)         
}

操作:

代码语言:javascript
复制
[HttpPost]public ViewResult(MyViewModel vm)
{
...

请注意,在回发时,只有具有可用输入的属性才会有值。也就是说,如果Person有一个.SSN属性,那么它在post操作中将不可用,因为它不是表单中的一个字段。

请注意,MVC的模型绑定的工作方式是,它只查找连续的ID。因此,在有条件地隐藏项的情况下,这样做将导致它不绑定第5项之后的任何数据,因为一旦遇到ID的间隙,它将停止绑定。即使有10个人,你也只能在回发时得到前4个:

代码语言:javascript
复制
@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)           
    }
}
票数 58
EN

Stack Overflow用户

发布于 2014-04-17 03:55:45

一个干净的解决方案是创建一个泛型类来处理列表,这样您就不需要在每次需要时都创建一个不同的类。

代码语言:javascript
复制
public class ListModel<T>
{
    public List<T> Items { get; set; }

    public ListModel(List<T> list) {
        Items = list;
    }
}

当您返回View时,您只需简单地执行以下操作:

代码语言:javascript
复制
List<customClass> ListOfCustomClass = new List<customClass>();
//Do as needed...
return View(new ListModel<customClass>(ListOfCustomClass));

然后在模型中定义列表:

代码语言:javascript
复制
@model ListModel<customClass>

准备好了:

代码语言:javascript
复制
@foreach(var element in Model.Items) {
  //do as needed...
}
票数 11
EN

Stack Overflow用户

发布于 2013-03-13 11:28:41

~控制器

代码语言:javascript
复制
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);
        }    
    }
}

~强类型索引视图

代码语言:javascript
复制
@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>

~强类型发送视图

代码语言:javascript
复制
@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。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15375800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档