如何在局部视图中获取模型属性名称

Bob*_*lth 3 c# reflection asp.net-core-mvc asp.net-core

我有一个 ASP.NET Core 部分视图,它请求(例如)一个人的名字和姓氏。部分视图采用以下视图模型:

// MyApp.NamePartialViewModel.cs
public class NamePartialViewModel{
  public string FirstName { get; set; }
  public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

部分视图为其视图模型渲染输入元素,如下所示(显然,我省略了标签和不显眼的验证内容):

@* NamePartialView.cshtml *@
@model MyApp.NamePartialViewModel
<input asp-for="FirstName" />
<input asp-for="LastName>" />
Run Code Online (Sandbox Code Playgroud)

现在,局部视图在父视图中被引用。为了获得一个相当完整的示例,我将使用部分视图来获取两个不同人的姓名,因此视图模型如下所示:

// MyApp.MyViewModel.cs
public class MyViewModel {
  public NamePartialViewModel FirstPersonName { get; set; }
  public NamePartialViewModel SecondPersonName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

最后,父视图(由控制器显示)如下所示:

@model MyApp.MyViewModel
<form method="post">
  <partial name="NamePartialView" model="@Model.FirstPersonName" />
  <partial name="NamePartialView" model="@Model.SecondPersonName" />
</form>
Run Code Online (Sandbox Code Playgroud)

这里的要点是每个元素都向分部视图<partial>提供一个实例。NamePartialViewModel

我的问题是:有没有办法在分部视图(或从分部视图调用的代码中)获取绑定到模型的属性名称?换句话说,我想发现(在本例中)我的模型绑定到名为 FirstPersonName 或 SecondPersonName 的属性(即父视图模型中的属性名称)。

那么,你问我为什么需要这个?因为为了使控制器 POST 例程中的模型绑定正常工作,我需要在<input>元素的name属性前添加属性名称前缀,因此第一个部分视图调用实际上会呈现如下所示的内容:

<input name="FirstPersonName.FirstName" id="FirstPersonName_FirstName" />
<input name="FirstPersonName.LastName" id="FirstPersonName_LastName" />
Run Code Online (Sandbox Code Playgroud)

所以我需要一些代码来根据父视图模型中的属性名称来构造前缀,该父视图模型将成为部分视图的视图模型。

Rez*_*aei 5

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
Run Code Online (Sandbox Code Playgroud)

MyViewModel.cshtml

@model MyApp.MyViewModel

<partial name="NamePartialView" for="FirstPersonName" />
<partial name="NamePartialView" for="SecondPersonName" />
Run Code Online (Sandbox Code Playgroud)