为 asp-for 指定自定义名称(只需要 child 属性)

Joh*_*nC1 5 c# asp.net-core asp.net-core-tag-helpers

假设我有这个代码:

<input type="hidden" asp-for="CurrentThread.ThreadId" />
Run Code Online (Sandbox Code Playgroud)

这将生成一个名为 的隐藏输入CurrentThread_ThreadId。但是,我希望"ThreadId"只有这个名字。基本上,想忽略任何父类,只想要最后一个属性的名称。

我可以轻松做到:

<input type="hidden" asp-for="CurrentThread.ThreadId" name="ThreadId" />
Run Code Online (Sandbox Code Playgroud)

但是,我正在失去智能。

我只是想知道是否可以"ThreadId"通过 Intellisense生成名称。

Alb*_*rtK 6

您可以扩展现有的输入标签助手来为name属性设置自定义值。

[HtmlTargetElement("input", TagStructure = TagStructure.WithoutEndTag)]
public class MyTagHelper : Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper
{
    [HtmlAttributeName("asp-short-name")]
    public bool IsShortName { set; get; }

    public MyTagHelper(IHtmlGenerator generator) : base(generator)
    {
    }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        if (IsShortName)
        {
            string nameAttrValue = (string)output.Attributes.Single(a => a.Name == "name").Value;
            output.Attributes.SetAttribute("name", nameAttrValue.Split('.').Last());
        }
        base.Process(context, output);
    }
}
Run Code Online (Sandbox Code Playgroud)

要注册您的自定义标签助手,您需要添加到_ViewImports.cshtml

@addTagHelper *, [AssemblyName]
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它:

<input type="hidden" asp-for="CurrentThread.ThreadId" asp-short-name="true"/>
Run Code Online (Sandbox Code Playgroud)

注意:正如@Stephen Muecke 指出的,默认模型绑定将不起作用。您可能需要创建自定义模型绑定器或使用其他技术从请求中检索模型值