如何创建与使用标记辅助
问题描述:
我用下面的多个视图代码模型绑定自定义编辑器:如何创建与使用标记辅助
<input asp-for="@Model.Tags" class="form-control" data-provider="tagseditor" />
<!-- some additional code will be added in future -->
,我想利用这个代码,并创建可重用TagHelper(或alternativelly ViewComponent)从它,我会用这样的:
<tags-editor for="@Model.Tags" />
但是我无法从我的自定义标签帮手ModelExpression
传递到底层InputTagHelper。
我越来越:
的ArgumentException:一个HTML字段的名称不能为空或空。请使用方法 Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper.Editor或 Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper`1.1.EditorFor with一个 非空htmlFieldName参数值。参数名:表达
在此这条线:_htmlHelper.PartialAsync
<!-- Views/Shared/TagHelpers/TagsEditor -->
@model ModelExpression
<input asp-for="@Model" class="form-control" data-provider="tagseditor" />
答
问题的要点来自于一个事实,即ModelExpression
本身并不是一种模式。您必须致电其Model
属性。
所以在您的局部视图:
<!-- Views/Shared/TagHelpers/TagsEditor -->
@model ModelExpression
<input asp-for="@Model.Model" class="form-control" data-provider="tagseditor" />
然后,你不能输出标签名称设置为空,因为这将产生在你看来一个<null></null>
标签。我建议你将它改为“div”,或者任何适合你的容器。
最后,由于输入的标签是自闭,则需要输出标签模式更改为TagMode.StartTagAndEndTag
强制产生<div></div>
,而不是仅仅<div/>
。
总而言之,ProcessAsync
方法变为:
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "div";
output.TagMode = TagMode.StartTagAndEndTag;
var partial = await _htmlHelper.PartialAsync("TagHelpers/TagsEditor", For);
var writer = new StringWriter();
partial.WriteTo(writer, _htmlEncoder);
output.Content.SetHtmlContent(writer.ToString());
}
这是一个非常巧妙地利用了部分意见。 –