ASP.NET 核心 6,在 EditorTemplate 上下文中获取自定义 asp-for TagHelper 的元数据
ASP.NET Core 6, Obtaining Metadata for a custom asp-for TagHelper in the context of an EditorTemplate
在 ASP.NET Core 6 的常规 razor 视图中给定一个语句编辑器。
@Html.EditorFor(_ => _.Person.FirstName, "boot-text")
模型看起来像这样。
public class Model
{
[DataMember(Name = "firstName", IsRequired = true)]
[Required]
[StringLength(250)]
[DataType(DataType.Text)]
[DisplayName("Given Name")]
public string? FirstName { get; set; }
}
我创建了一个自定义模板。 boot-text.cshtml
<div class="row mb-15px">
<label asp-for="@Model" class="form-label col-form-label col-md-3"></label>
<div class="col-md-9">
<input asp-for="@Model" type="text" class="form-control mb-5px"
<span asp-validation-for="@Model"></span>
</div>
</div>
我有一个标签助手。
[HtmlTargetElement("input", TagStructure = TagStructure.Unspecified)]
public class AspForTagHelper : TagHelper
{
[HtmlAttributeName("asp-for")]
public ModelExpression For { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
// For is null here
}
}
在上面的 TagHelper
中,模型总是 NULL。
我在这里查看了源代码:
https://github.com/dotnet/aspnetcore/blob/main/src/Mvc/Mvc.TagHelpers/src/InputTagHelper.cs
我将所有源代码复制到我自己的标签助手中,并且在 For.Metadata
处也出现了引用异常
var metadata = For.Metadata;
var modelExplorer = For.ModelExplorer;
这引出了一个问题,默认标签助手是如何设法获取模型元数据的。如果我完全删除我的标签助手,上面的 asp-for 使用我的模板渲染得很好。
所以我找到的源代码可能不是真正的 ASPNET Core 6 源代码?
您的标签助手将 运行 基于您 [HtmlTargetElement]
属性的内容。
当您的标签助手为 运行 时,您的属性将基于任何 [HtmlAttributeName]
进行绑定。但是这个绑定是可选的,不会阻止你的标签助手 运行ning.
因为您只指定了 [HtmlTargetElement("input"
而没有包括任何必需的 Attributes =
,您的标签助手将 运行 对抗所有 <input
标签,即使它们有没有 asp-for
属性。这就解释了为什么您看到 For
属性 总是 null
.
TLDR:您需要的是;
[HtmlTargetElement("input", Attributes = "asp-for", TagStructure = TagStructure.Unspecified)]
public class AspForTagHelper : TagHelper
{ ... }
在 ASP.NET Core 6 的常规 razor 视图中给定一个语句编辑器。
@Html.EditorFor(_ => _.Person.FirstName, "boot-text")
模型看起来像这样。
public class Model
{
[DataMember(Name = "firstName", IsRequired = true)]
[Required]
[StringLength(250)]
[DataType(DataType.Text)]
[DisplayName("Given Name")]
public string? FirstName { get; set; }
}
我创建了一个自定义模板。 boot-text.cshtml
<div class="row mb-15px">
<label asp-for="@Model" class="form-label col-form-label col-md-3"></label>
<div class="col-md-9">
<input asp-for="@Model" type="text" class="form-control mb-5px"
<span asp-validation-for="@Model"></span>
</div>
</div>
我有一个标签助手。
[HtmlTargetElement("input", TagStructure = TagStructure.Unspecified)]
public class AspForTagHelper : TagHelper
{
[HtmlAttributeName("asp-for")]
public ModelExpression For { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
// For is null here
}
}
在上面的 TagHelper
中,模型总是 NULL。
我在这里查看了源代码: https://github.com/dotnet/aspnetcore/blob/main/src/Mvc/Mvc.TagHelpers/src/InputTagHelper.cs
我将所有源代码复制到我自己的标签助手中,并且在 For.Metadata
var metadata = For.Metadata;
var modelExplorer = For.ModelExplorer;
这引出了一个问题,默认标签助手是如何设法获取模型元数据的。如果我完全删除我的标签助手,上面的 asp-for 使用我的模板渲染得很好。
所以我找到的源代码可能不是真正的 ASPNET Core 6 源代码?
您的标签助手将 运行 基于您 [HtmlTargetElement]
属性的内容。
当您的标签助手为 运行 时,您的属性将基于任何 [HtmlAttributeName]
进行绑定。但是这个绑定是可选的,不会阻止你的标签助手 运行ning.
因为您只指定了 [HtmlTargetElement("input"
而没有包括任何必需的 Attributes =
,您的标签助手将 运行 对抗所有 <input
标签,即使它们有没有 asp-for
属性。这就解释了为什么您看到 For
属性 总是 null
.
TLDR:您需要的是;
[HtmlTargetElement("input", Attributes = "asp-for", TagStructure = TagStructure.Unspecified)]
public class AspForTagHelper : TagHelper
{ ... }