如何通过标记助手将模型元数据传递到局部视图



为了自定义输入,我添加了一个标记助手和一个局部视图。我的问题是模型验证属性id,名称没有像我预期的那样生成。我在asp.net核心5中编写了代码。

例如,当我不使用标签助手作为以下代码时

public class ViewModel
{
[Required]
public string Title { get; set; }
}

查看

<form method="post">
<div class="form-group row">
<label asp-for="Title"></label>
<div class="col-md-9">
<input asp-for="Title"/>
<span asp-validation-for="Title"></span>
</div>
</div>
<button type="submit">Save</button>
</form>

为输入(标题(生成的Html如下代码,正如您所看到的数据val属性,id,名称是OK

<input type="text" 
data-val="true" 
data-val-required="Title is required" id="Title" name="Title" />

但是当我使用CustomTagHelper作为以下时

[HtmlTargetElement("div", Attributes = "custom")]
public class CustomTagHelper : TagHelper
{
private readonly IHtmlHelper html;
[HtmlAttributeName("asp-for")]
public ModelExpression DataModel { get; set; }
[HtmlAttributeNotBound]
[ViewContext]
public ViewContext ViewContext { get; set; }
public CustomTagHelper(IHtmlHelper htmlHelper)
{
html = htmlHelper;
}
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
(html as IViewContextAware).Contextualize(ViewContext);
var content = await html.PartialAsync("~/Views/Shared/_Custom.cshtml", DataModel);
output.Content.SetHtmlContent(content);
}
}

_自定义.cshtml

@model ModelExpression
<input asp-for="Model" />
<i class="fas fa-football"></i>

CustomTagHelper在视图中的使用

<div class="col-md-9">
<div custom="" asp-for="Title"></div>
<span asp-validation-for="Title"></span>
</div>

使用CustomTagHelper 时生成的Html

<input type="text" id="Model" name="Model" class="valid" aria-invalid="false">
<i class="fas fa-football"></i>

这个问题的解决办法是什么?

我的问题是模型验证属性id,名称没有像我预期的那样生成。

这是因为它是asp-for标记帮助程序中的Model,所以生成的html是正确的。对于您的场景,您需要按照@Hopeless所说的,自定义另一个标记助手来替换asp-for,或者您可以放弃部分视图,改为使用StringWriter在后端编写html。

[HtmlTargetElement("div", Attributes = "custom")]
public class CustomTagHelper : TagHelper
{
private readonly IHtmlGenerator _generator;
[HtmlAttributeName("asp-for")]
public ModelExpression DataModel { get; set; }
[HtmlAttributeNotBound]
[ViewContext]
public ViewContext ViewContext { get; set; }
public CustomTagHelper(IHtmlGenerator generator)
{
_generator = generator;
}
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
using (var writer = new StringWriter())
{
var textArea = _generator.GenerateTextBox(ViewContext,
DataModel.ModelExplorer,
DataModel.Name,
DataModel.Model,
null,
null);
textArea.WriteTo(writer, NullHtmlEncoder.Default);
writer.Write(@"<i class=""fas fa - football""></i>");
output.Content.SetHtmlContent(writer.ToString());
}
}
}

最新更新