我有一个正在构建的 MVC 4 站点,它从 WCF 服务获取所有数据。我试图偷懒,在我的 MVC 模型中使用在我的 WCF 项目中生成的代理类。目前为止,一切都好。
我有一个窗体视图,它包含一个 Customer 类,该类具有一堆基元类型化属性和 3 个其他复杂对象的泛型列表 (List)。
基元类型一切都按预期工作,我能够将表单中的一些字段绑定到视图并对其进行编辑。伟大。
我的问题是,当模型回发到窗体时,集合始终为空,即使它们最初填充了对象。
知道为什么 MVC 不会在表单发布期间将我的子集合保留在模型中吗?
<!-- form -->
@using (Html.BeginForm("ourinformation", "Account", Model, FormMethod.Post, new{id= "contactForm" })){}
您需要将集合发布回控制器,例如,假设您有以下用作模型的类:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public List<Group> Groups { get; set; }
}
public class Group
{
public int Id { get; set; }
public string Name { get; set; }
}
然后说这是您将模型传递到视图的方式:
public ActionResult Index()
{
var model = new User
{
Name = "Test",
Groups = new List<Group>
{
new Group {Name = "GROUP1"},
new Group {Name = "GROUP2"}
}
};
return View(model);
}
这就是你期待的方式:
[HttpPost]
public ActionResult Index(User user)
{
// do your thing ...
}
您的视图应如下所示:
<form action="/" method="post">
<input id="Name" name="Name" type="text" value="Test" /><
<input name="Groups[0].Name" type="text" value="GROUP1" />
<input name="Groups[1].Name" type="text" value="GROUP2" />
<input type="submit" value="Submit" name="Submit" />
</form>
现在,如果您提交,您的模型将被填充。当然,您可以对Group
集合使用编辑器模板,只需在EditorTemplates
-> '/Shared/EditorTemplates/Group.cshtml' 中创建一个包含以下内容的视图:
@model MyApp.Models.Group
@Html.EditorFor(x => x.Name)
现在回到你的Index.cshtml
,你可以做:
@model User
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Name)
@Html.EditorFor(x => x.Groups)
<input type="submit" value="Submit" name="Submit" />
}
在这里,@Html.EditorFor(x => x.Groups)
将循环访问您的集合,并创建与编辑器模板中对应的必要标记。我希望这有所帮助。