我正在玩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"
答案 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);
...