如何创建与使用标记辅助

问题描述:

我用下面的多个视图代码模型绑定自定义编辑器:如何创建与使用标记辅助

<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" /> 
​​
+0

这是一个非常巧妙地利用了部分意见。 –

问题的要点来自于一个事实,即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()); 
}