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)
所以我需要一些代码来根据父视图模型中的属性名称来构造前缀,该父视图模型将成为部分视图的视图模型。
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)
| 归档时间: |
|
| 查看次数: |
2488 次 |
| 最近记录: |