我是MVC的新手,对此有些困难。
为简单起见,我有一个“Person”对象,这个对象有一个名为“EmailaddressList”的IEnumerable属性。
我已经通过Visual Studio 2012生成了一个编辑页面。主要对象属性是在编辑页面上生成的,其中包含Name和LastName等文本框。
但是,我的视图中不会自动生成IEnumerable子对象列表中的电子邮件地址列表。 这没关系,我已经使用每种类型的电子邮件地址的标签手工编写了该代码。
到目前为止一切顺利。
问题: 当我在HTTP-Post方法中接收模型(person对象)时,EmailAddressList为null。 为什么会这样,当我把它发送到视图时它不是null。 我列出了电子邮件的标签是局部视图。 谁能给我一些提示,这是我在这里缺少的东西吗?*
查看-代码
<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();
}
}
答案 0 :(得分:4)
那是因为为了正确索引你的字段(所以模型绑定器可以做到这一点),你必须使用for
循环。
首先,将您的IEnumerable
更改为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>
}
答案 1 :(得分:1)
根据您的更新,这不起作用的原因是因为默认模型绑定器仅依赖于简单数据集合的顺序。当涉及复杂类型时,您需要为每个项目提供相关索引,否则它不知道您指的是哪个项目属性。
@for (int i = 0; i < Model.EmailAddressList.Count; i++) {
Html.TextBoxFor(m => m.EmailAddressList[i].EmailAddress) %>
}
见Phil Haack关于model binding to a list的文章。
答案 2 :(得分:0)
这是因为你的元素没有被识别为正确的东西让MVC在帖子背面捡起它们,你需要的是:
@Html.EditorFor(model => model.EmailAddressList);
然后,请参阅我的帖子here,了解如何根据您的需要进行查看。