ASP.NET Core — TagHelper, частичные представления и конфликт имен свойств

Допустим, в проекте ASP.NET Core MVC у меня есть два частичных представления _viewA и _viewB и две связанные модели ModelA и ModelB.

И скажем, как ModelA, так и ModelB имеют свойство под названием MyProperty. Затем и в _viewA, и в _viewB я использую asp-for="MyProperty".

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

Обратите внимание, что я не хочу переименовывать MyProperty, так как мои модели не должны волноваться об ограничениях пользовательского интерфейса.


person François    schedule 05.10.2017    source источник
comment
Не используйте частичные - используйте EditorTemplates (но если вы используете частичные, вам нужно передать HtmlFieldPrefix - см. этот ответ для примера   -  person    schedule 05.10.2017
comment
Вот и все! Мне пришлось немного обновить PartialFor с ядром .net, но спасибо!   -  person François    schedule 05.10.2017
comment
Я пытался найти дубликат для asp.net-core-mvc, но не смог, поэтому вы можете добавить свой собственный ответ с измененным кодом.   -  person    schedule 05.10.2017
comment
Я всегда переименовываю идентификатор входов. Мне не нравятся автоматически сгенерированные идентификаторы. Иногда приходится так делать, т. е. радиокнопки. А с Core 2.0 и TagHelper переименование стало проще, чем когда-либо.   -  person David Liang    schedule 06.10.2017


Ответы (1)


Tks к @stephen-muecke, а также этому post HtmlFieldPrefix. Вот метод расширения, который работает с .Net Core для использования в @html.PartialFor("_viewA", "viewAPrefix"). Затем все идентификаторы и имена в частичном представлении имеют префикс (даже без использования asp-for).

public static IHtmlContent PartialFor(this IHtmlHelper helper, string partialViewName, string prefix)
{
    var viewData = new ViewDataDictionary(helper.ViewData);
    var htmlPrefix = viewData.TemplateInfo.HtmlFieldPrefix;
    viewData.TemplateInfo.HtmlFieldPrefix += !Equals(htmlPrefix, string.Empty) ? $".{prefix}" : prefix;
    return helper.Partial(partialViewName, viewData);
}
person François    schedule 05.10.2017