Использование нескольких частичных видов в бритвенных формах MVC3 - PullRequest
2 голосов
/ 03 августа 2011

У меня есть страховая заявка, в которой есть контактная информация для двух человек.Я создал частичное представление Razor для записи контакта и дважды поместил его в форму.Модель основного представления (VmApplicationForm) содержит два экземпляра модели вспомогательного представления (VmPolicyHolder), соответствующие двум контактам, а также некоторые свойства, общие для обоих контактов.Я звоню @Html.RenderPartial("_CreateOrEdit", Model.contactInfo1) и @Html.RenderPartial("_CreateOrEdit", Model.contactInfo2) на странице.При таком расположении (без сюрпризов) отображаемый код имеет дубликаты идентификаторов для элементов ввода формы.

Есть ли способ получить RenderPartial с префиксом идентификаторов и атрибутов имени?Я не видел этого в документации, но, возможно, я что-то упустил.

Ответы [ 2 ]

4 голосов
/ 03 августа 2011

Извините, у меня еще нет времени, чтобы дать вам пример кода, но я дам вам идею. Сначала вы должны создать EditorTemplate для этого, вероятно, называемого ContactInfo класса. А затем в представлении редактирования базового класса (удерживая эти два контакта) вы должны написать

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

Таким образом, он будет отображать этот EditorTemplate и генерировать правильные идентификаторы и имена для входов внутри него.

0 голосов
/ 03 августа 2011

То, что вы делаете, пытается опубликовать коллекцию элементов в форме - это действительно может быть сделано в MVC (а также в любой веб-странице / приложении, использующем тег FORM), однако это требует некоторой специальной обработки для избегать коллизий идентификаторов и правильно форматировать данные постов. У Стива Сандерсона есть отличный пост о том, как этого добиться:

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

По сути, это оболочка для добавления уникальных направляющих к идентификаторам элементов (в вашем случае для каждого 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
}
...