4

我是 MVC 的新手,理解这一点有一些困难。

为简单起见,我有一个“Person”对象,该对象有一个名为“EmailaddressList”的 IEnumerable 属性。

我通过 Visual Studio 2012 生成了一个编辑页面。主要对象属性是在编辑页面上生成的,带有名称和姓氏等文本框。

但是,在我看来,IEnumerable 子对象列表中的电子邮件地址列表不会自动生成。没关系,我已经为每种类型的电子邮件地址使用选项卡手动编写了该代码。

到现在为止还挺好。

问题: 当我在 HTTP-Post 方法中收到模型(人对象)时,EmailAddressList 为空。为什么会这样,我发送到视图时它不为空。I 列出电子邮件地址的选项卡在部分视图中。谁能给我一些提示,这是我在这里缺少的东西吗? *

查看代码

<div id="tabs">
<ul>
    @foreach (var item in Model.EmailAddressList)
    {
        <li><a href="#@item.AddressType">@Html.Label(item.AddressType)</a></li>
    }
</ul>
@foreach (var item in Model.EmailAddressList)
{
    <div id="@item.AddressType">
        <p>
            @Html.TextBoxFor(s => item.EmailAddress, new { @class = "input-xxlarge" })
        </p>
    </div>
}
</div>

控制器(接收方法) 这里 person.EmailAddressList 为 null

    [HttpPost]
    public ActionResult Create(Person person)
    {
        if (ModelState.IsValid) 
        {
            personRepository.InsertOrUpdate(person);
            personRepository.Save(); 
            return RedirectToAction("Index");
        } 
        else 
        {
            return View();
        }
    }
4

3 回答 3

6

那是因为为了正确索引您的字段(以便模型绑定器可以完成它的工作),您必须使用for循环。

首先,将 your 更改IEnumerable为 a List(这样我们就可以在视图中使用索引器)。

然后将您更改foreach为以下for循环:

@for (int i = 0; i < Model.EmailAddressList.Count; i++)
{
    <div id="@Model.EmailAddressList[i].AddressType">
        <p>
            @Html.TextBoxFor(m => m.EmailAddressList[i].EmailAddress, new { @class = "input-xxlarge" })
        </p>
    </div>
}
于 2013-04-23T14:22:52.203 回答
1

根据您的更新,这不起作用的原因是默认模型绑定器仅依赖于简单数据集合的顺序。当涉及到复杂类型时,您需要为每个项目提供相关索引,否则它不知道您指的是哪个项目属性,例如

@for (int i = 0; i < Model.EmailAddressList.Count; i++) {
    Html.TextBoxFor(m => m.EmailAddressList[i].EmailAddress) %>
}

请参阅 Phil Haack 关于模型绑定到列表的文章。

于 2013-04-23T14:44:15.453 回答
0

这是由于您的元素没有被标识为 MVC 在回帖中提取它们的正确方法,您需要的是:

@Html.EditorFor(model => model.EmailAddressList);

然后,请参阅我位于此处的帖子,了解如何使其看起来像您想要的那样。

于 2013-04-23T14:14:04.640 回答