Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义标记帮助器如何在列表中设置id和名称_C#_Asp.net Core_Asp.net Core Tag Helpers - Fatal编程技术网

C# 自定义标记帮助器如何在列表中设置id和名称

C# 自定义标记帮助器如何在列表中设置id和名称,c#,asp.net-core,asp.net-core-tag-helpers,C#,Asp.net Core,Asp.net Core Tag Helpers,我在玩MVC内核,并尝试做一些常见的用例。 我想知道如何实现以下场景。 因此,我想实现一个自定义标记帮助器元素,它可以识别元素何时来自列表,以使用相应的前缀数组设置元素名称和id。 我意识到它与使用属性asp for的元素配合得很好, 那么,如何实现自定义标记帮助器获得相同的结果呢 自定义标记帮助程序 private const string selectEnumValue = "value"; [HtmlAttributeName(selectEnumValue)] public Model

我在玩MVC内核,并尝试做一些常见的用例。 我想知道如何实现以下场景。 因此,我想实现一个自定义标记帮助器元素,它可以识别元素何时来自列表,以使用相应的前缀数组设置元素名称和id。 我意识到它与使用属性
asp for
的元素配合得很好, 那么,如何实现自定义标记帮助器获得相同的结果呢

自定义标记帮助程序

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());
}
<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>
剃须刀示例

<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>

@对于(int i=0;i
使用asp获得的结果

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());
}
<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>

使用自定义标记辅助对象生成结果

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());
}
<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>
Select…TestHey

因此,我的问题是如何实现标记帮助器来设置与
asp相同结构的id,以便该元素id和名称看起来像
id=“List\u 0\u AboutType”
name=“List[0]。AboutType”
解决方案与传递ModelExpression名称
一样简单(SelectEnumValue.name)


对于id属性,这篇有用的文章对我很有用:

您必须使用前面提到的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生成经过清理的Id。名称:

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

如果你有一个剃须刀页面,你可能会在页面上看到:
ModelExpression.Name
值具有“点”语法,因此它可能适用于
Name
属性。但是OP询问如何获取使用“下划线”语法的
id
属性值。