自定义标记助手如何在列表中设置标识和名称

时间:2018-04-03 13:40:06

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

我正在玩MVC核心并试图做一些常见的用例。 我想知道如何实现以下方案。 所以我想实现一个自定义标记辅助元素,它可以识别元素何时来自列表,设置元素名称和id与对应的前缀数组。 我意识到使用属性asp-for的元素很好, 那么我怎么能得到实现自定义Tag帮助器的相同结果。

自定义标记助手

private const string selectEnumValue = "value";

[HtmlAttributeName(selectEnumValue)]
public ModelExpression SelectEnumValue { get; set; }

public override void Process(TagHelperContext context, TagHelperOutput output)
{
    output.TagName = "select";
    output.Attributes.SetAttribute("id", SelectEnumValue.Metadata.PropertyName);
    output.Attributes.SetAttribute("name", SelectEnumValue.Metadata.PropertyName);
    output.Content.AppendHtml(Options());
}

Razor示例

<table>
    @for (int i = 0; i < Model.List.Count; i++)
    {
    <tr>
        <td><select-enum value="List[i].AboutType"></select-enum></td>
        <td><select-bool value="List[i].IsActive"></select-bool></td>
        <td><lookup value="List[i].AboutId" text="List[i].AboutText" url="About">Test</lookup></td>
        <td><input asp-for="List[i].StartDate" class="date form-control" /></td>
    </tr>
    }
</table>

使用asp-for

的结果
<input class="date form-control" type="datetime-local" data-val="true" data-val-required="The StartDate field is required." id="List_0__StartDate" name="List[0].StartDate" value="2018-04-03T14:23:25.791">

使用自定义标记帮助

的结果
<select id="AboutType" name="AboutType"><option value="">Select...</option><option selected="" value="1">Test</option><option value="2">Hey</option></select>

所以我的问题是我如何实现标记帮助器来设置一个与asp-for具有相同结构的id,因此这个元素id和名称看起来像id="List_0__AboutType"name="List[0].AboutType"

2 个答案:

答案 0 :(得分:0)

解决方案就像传递ModelExpression名称(SelectEnumValue.Name)一样简单。

private const string selectEnumValue = "value";

[HtmlAttributeName(selectEnumValue)]
public ModelExpression SelectEnumValue { get; set; }

public override void Process(TagHelperContext context, TagHelperOutput output)
{
    output.TagName = "select";
    output.Attributes.SetAttribute("id", SelectEnumValue.Name);
    output.Attributes.SetAttribute("name", SelectEnumValue.Name);
    output.Content.AppendHtml(Options());
}

答案 1 :(得分:0)

对于id属性,这篇有用的文章对我有用: http://blog.techdominator.com/article/using-html-helper-inside-tag-helpers.html

您将必须使用前面提到的ModelExpression属性,例如:

public ModelExpression AspFor { get; set; }

(由于大小写,属性“ AspFor”将作为“ asp-for”属性使用)

然后,将HtmlHelper插入您的ctor中:

    private IHtmlHelper _htmlHelper;

    public MyCustomTagHelper(IHtmlHelper htmlHelper)
    {
        _htmlHelper = htmlHelper;
    }

添加属性:

    [ViewContext]
    [HtmlAttributeNotBound]
    public ViewContext ViewContext { get; set; }

初始化HtmlHelper的上下文,并使用它从ModelExpression.Name生成已清理的ID:

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        (_htmlHelper as IViewContextAware).Contextualize(ViewContext);
        var id = _htmlHelper.GenerateIdFromName(AspFor.Name);

...