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

时间:2018-02-19 09:33:49

标签: c# asp.net-core asp.net-core-tag-helpers

假设我有这段代码: <input type="hidden" asp-for="CurrentThread.ThreadId" />

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

我很容易做到:<input type="hidden" asp-for="CurrentThread.ThreadId" name="ThreadId" />但是,我失去了智能感知。

我只是想知道是否有一些东西可以用Intellisense生成名称“ThreadId”。

1 个答案:

答案 0 :(得分:1)

您可以扩展现有的输入标记助手,为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);
    }
}

要注册自定义代码帮助器,您需要添加到_ViewImports.cshtml

@addTagHelper *, [AssemblyName]

然后你可以使用它:

<input type="hidden" asp-for="CurrentThread.ThreadId" asp-short-name="true"/>

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