Как получить имя свойства модели в частичном представлении

У меня есть частичное представление ASP.NET Core, которое запрашивает (например) имя и фамилию человека. Частичное представление использует эту модель представления:

// MyApp.NamePartialViewModel.cs
public class NamePartialViewModel{
  public string FirstName { get; set; }
  public string LastName { get; set; }
}

Частичное представление отображает входные элементы для своей модели представления, например так (очевидно, я пропустил метки и ненавязчивую валидацию):

@* NamePartialView.cshtml *@
@model MyApp.NamePartialViewModel
<input asp-for="FirstName" />
<input asp-for="LastName>" />

Теперь на частичное представление ссылается родительское представление. Ради достаточно полного примера я буду использовать частичное представление для получения имен двух разных людей, поэтому модель представления выглядит следующим образом:

// MyApp.MyViewModel.cs
public class MyViewModel {
  public NamePartialViewModel FirstPersonName { get; set; }
  public NamePartialViewModel SecondPersonName { get; set; }
}

И, наконец, родительское представление (отображаемое контроллером) выглядит так:

@model MyApp.MyViewModel
<form method="post">
  <partial name="NamePartialView" model="@Model.FirstPersonName" />
  <partial name="NamePartialView" model="@Model.SecondPersonName" />
</form>

Дело в том, что каждый элемент <partial> передает экземпляр NamePartialViewModel частичному представлению.

Мой вопрос: Есть ли способ в частичном представлении (или в коде, вызываемом из частичного представления) получить имя свойства, привязанного к модели? Другими словами, я хочу узнать что (в этом примере) моя модель привязана к свойству с именем FirstPersonName или SecondPersonName (то есть имя свойства в родительской модели представления).

Так зачем мне это нужно, спросите вы? Потому что для того, чтобы привязка модели в процедуре POST контроллера работала правильно, мне нужно добавить к атрибуту name элемента <input> префикс имени свойства, чтобы первый частичный вызов представления фактически отображал что-то вроде этого:

<input name="FirstPersonName.FirstName" id="FirstPersonName_FirstName" />
<input name="FirstPersonName.LastName" id="FirstPersonName_LastName" />

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


person Bob.at.Indigo.Health    schedule 09.02.2020    source источник


Ответы (1)


При использовании помощника тега partial при передаче модели с использованием for имя свойства будет доступно через ViewData.TemplateInfo.HtmlFieldPrefix в частичном представлении.

Пока вы используете стандартные хелперы, вам не нужно использовать ViewData.TemplateInfo.HtmlFieldPrefix, однако, как автор хелпера тегов или как тот, кто хочет использовать ручную визуализацию тегов, вам нужно позаботиться об этом.

NamePartialView.cshtml

@model MyApp.NamePartialViewModel

<label asp-for="FirstName" />
<input asp-for="FirstName" />
<label asp-for="LastName" />
<input asp-for="LastName" />

Just in case of creating manual tags, here is the prefix to use:
@ViewData.TemplateInfo.HtmlFieldPrefix

MyViewModel.cshtml

@model MyApp.MyViewModel

<partial name="NamePartialView" for="FirstPersonName" />
<partial name="NamePartialView" for="SecondPersonName" />
person Reza Aghaei    schedule 09.02.2020