在MVC3剃刀形式中使用多个部分视图

时间:2011-08-03 16:07:25

标签: asp.net-mvc forms razor asp.net-mvc-partialview

我有一份保险参赛表格,其中包含两个人的联系信息。我为联系人条目创建了一个Razor局部视图,并将其放在表单中两次。 “主”视图模型(VmApplicationForm)包含与两个联系人对应的辅助视图模型(VmPolicyHolder)的两个实例以及两个联系人共有的一些属性。我在页面中呼叫@Html.RenderPartial("_CreateOrEdit", Model.contactInfo1)@Html.RenderPartial("_CreateOrEdit", Model.contactInfo2)。通过这种安排(没有意外),呈现的代码具有表单输入元素的重复ID。

有没有办法让RenderPartial为ID和Name属性添加前缀?我在文档中看不到这一点,但也许我错过了一些东西。

2 个答案:

答案 0 :(得分:4)

抱歉,我没时间给你提供示例代码,但我会给你一个想法。您应该首先为可能称为ContactInfo类的EditorTemplate创建{{3}}。然后,在基类(保持两个联系人)编辑视图中,你应该写

@Html.EditorFor(model => model.contactInfo1)
@Html.EditorFor(model => model.contactInfo2)

这样,它将呈现EditorTemplate并为其中的输入生成正确的id和名称。

答案 1 :(得分:-1)

您正在尝试在表单中发布项目集合 - 这确实可以在MVC中(以及在使用FORM标记的任何网页/应用程序中)完成,但是它需要一些特殊的处理避免id冲突并正确格式化帖子数据。史蒂夫桑德森有一篇关于如何实现这一目标的好文章:

http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

本质上它是一个包装器,用于向元素id附加唯一的guid(在每种情况下为每个contactInfo),并在标记中创建正确的数组格式。例如<input name="ContactInfo[f2cc4d6b-fc32-45e9-9d3d-fce54c3fede3].FirstName">

如果您的模型类似于ContactInfo,您将最终发布

[HttpPost]
public ActionResult Index(IEnumerable<ContactInfo> contacts)
{
    // To do: do whatever you want with the data
}