Предположим, у меня есть ViewModel вроде
public class AnotherViewModel
{
public string Name { get; set; }
}
public class MyViewModel
{
public string Name { get; set; }
public AnotherViewModel Child { get; set; }
public AnotherViewModel Child2 { get; set; }
}
В представлении я могу отрендерить партиал с помощью
<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>
В частичной сделаю
<%= Html.TextBox("Name", Model.Name) %>
or
<%= Html.TextBoxFor(x => x.Name) %>
Однако проблема в том, что оба будут отображать name = "Name", в то время как мне нужно иметь name = "Child.Name" для правильной работы привязки модели. Или name = "Child2.Name", когда я визуализирую второе свойство с использованием того же частичного представления.
Как заставить мое частичное представление автоматически распознавать требуемый префикс? Я могу передать его как параметр, но это слишком неудобно. Это еще хуже, когда я хочу, например, отрендерить его рекурсивно. Есть ли способ визуализировать частичные представления с префиксом или, что еще лучше, с автоматическим повторным преобразованием вызывающего лямбда-выражения, чтобы
<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>
автоматически добавит правильный "Ребенок". префикс к сгенерированным строкам имени / идентификатора?
Я могу принять любое решение, включая сторонние механизмы просмотра и библиотеки - я действительно использую Spark View Engine (я «решаю» проблему с помощью его макросов) и MvcContrib, но не нашел там решения. XForms, InputBuilder, MVC v2 - подойдет любой инструмент / идея, обеспечивающая эту функциональность.
В настоящее время я думаю о кодировании этого сам, но это кажется пустой тратой времени, я не могу поверить, что эта тривиальная вещь еще не реализована.
Может существовать множество ручных решений, и все они приветствуются. Например, я могу заставить свои частичные данные основываться на IPartialViewModel <T> {public string Prefix; Модель Т; }. Но я бы предпочел какое-то существующее / одобренное решение.
UPDATE: есть подобный вопрос без ответа здесь .
helper.ViewData.TemplateInfo.HtmlFieldPrefix
в форме{oldprefix}.{newprefix}
new ViewDataDictionary(helper.ViewData)
наnew ViewDataDictionary(((HtmlHelper)helper).ViewData)
. Вы видите в этом проблемы?string oldPrefix = helper.ViewData.TemplateInfo.HtmlFieldPrefix; if (oldPrefix != "") name = oldPrefix + "." + name;
до сих пор я искал то же самое, что нашел этот недавний пост:
http://davybrion.com/blog/2011/01/prefixing-input-elements-of-partial-views-with-asp-net-mvc/
источник
ViewDataDictionary
конструктор, который принимает текущийViewData
, иначе вы потеряете ошибки состояния модели, данные проверки и т. Д.Мой ответ, основанный на ответе Махмуда Моравея, включая комментарий Ивана Златева.
Изменить: ответ Мохамуда неверен для вложенного частичного рендеринга. Вам нужно добавить новый префикс к старому, только если это необходимо. Это не было ясно в последних ответах (:
источник
Используя MVC2, вы можете добиться этого.
Вот строго типизированное представление:
Вот строго типизированное представление для дочернего класса (которое должно храниться в подпапке каталога представления с именем EditorTemplates):
Вот контроллер:
Вот пользовательские классы:
И источник вывода:
Теперь все готово. Установите точку останова в действии Create Post Controller для проверки. Однако не используйте это со списками, потому что это не сработает. См. Мой вопрос об использовании EditorTemplates с IEnumerable для получения дополнительной информации.
источник
Html.EditorFor
метода рендеринга дочерней формы. Именно для этого и должны использоваться шаблоны редактора. Это должен быть ответ.Это старый вопрос, но для тех, кто приезжает сюда в поисках решения, подумайте об использовании
EditorFor
, как это предлагается в комментарии в https://stackoverflow.com/a/29809907/456456 . Чтобы перейти от частичного представления к шаблону редактора, выполните следующие действия.Убедитесь, что ваше частичное представление привязано к ComplexType .
Переместите частичное представление в подпапку EditorTemplates текущей папки представления или в папку Shared . Теперь это шаблон редактора.
Измените
@Html.Partial("_PartialViewName", Model.ComplexType)
на@Html.EditorFor(m => m.ComplexType, "_EditorTemplateName")
. Шаблон редактора необязателен, если это единственный шаблон для сложного типа.Элементы ввода Html будут автоматически названы
ComplexType.Fieldname
.источник
PartailFor для asp.net Core 2 на случай, если кому-то понадобится.
источник
Я также столкнулся с этой проблемой и после долгих мучений обнаружил, что было проще перепроектировать мои интерфейсы, так что мне не нужно было отправлять обратно вложенные объекты модели. Это вынудило меня изменить рабочие процессы интерфейса: теперь я требую, чтобы пользователь сделал в два этапа то, что я мечтал сделать на одном, но удобство использования и ремонтопригодность кода нового подхода теперь для меня важнее.
Надеюсь, это кому-то поможет.
источник
Вы можете добавить помощника для RenderPartial, который принимает префикс и помещает его в ViewData.
Затем еще один помощник, который объединяет значение ViewData
а так в представлении ...
в частичном ...
источник
Как и вы, я добавляю свойство Prefix (строку) к своим ViewModels, которое я добавляю перед именами ввода, привязанными к моей модели. (ЯГНИ предотвращает нижеследующее)
Более элегантным решением может быть базовая модель представления, имеющая это свойство, и некоторые HtmlHelpers, которые проверяют, является ли модель представления производной от этой базы, и, если да, добавляют префикс к имени ввода.
Надеюсь, это поможет,
Дэн
источник
Как насчет того, чтобы непосредственно перед вызовом RenderPartial сделать
Тогда в вашей части у вас есть
источник