我注意到在我的项目中,我的所有表单字段都遵循相同的模式。一个典型的例子是:
<div class="col-x-x">
<label asp-for="Property"></label>
<span message="description">
<input asp-for="Property" />
<span asp-validation-for="Property"></span>
</div>
我很想用某种方式对这段代码进行分组,这样我就可以简单地将模型上的属性传递给它,并输出正确的 HTML。例如。:
<form-field for="Property" ...>
或者
@Html.StringFormField(...)
我遇到的问题是,无论我尝试什么方法,输出的 html 都是上面的原始 html,而不是从标签助手生成的 html。这两种方法我都试过了,都没有成功。此外,我尝试创建一个 razor 函数,但我所有的尝试都无法编译,而且我无法使局部 View 工作,因为在将字符串传递给 a 后,我无法找到获取属性信息的方法看法。
我最近的尝试是使用标签助手,但这有前面提到的相同问题。最新版本的代码如下:
[HtmlTargetElement("form-field", Attributes = "for")]
public class FormFieldTagHelper : TagHelper
{
[HtmlAttributeName("for")]
public ModelExpression For { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "div";
output.TagMode = TagMode.StartTagAndEndTag;
var contentBuilder = new HtmlContentBuilder();
contentBuilder.AppendHtmlLine($"<label asp-for=\"{For}\"></label>");
contentBuilder.AppendHtmlLine($"<span message=\"description.\"></span>");
contentBuilder.AppendHtmlLine($"<input asp-for=\"{For}\"/>");
contentBuilder.AppendHtmlLine($"<span asp-validation-for=\"{For}\"/></span>");
output.Content.SetHtmlContent(contentBuilder);
}
}
有一个问题解决了这个问题( with no solution ),这表明导入的顺序是一个潜在的问题,所以我的导入如下:
@addTagHelper Project.Web.Features.Shared.*, Project.Web
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
欢迎任何解决方案,无论是标签助手还是其他方法。
最佳答案
您可以使用 IHtmlGenerator要生成这些元素,请引用我下面的演示代码:
[HtmlTargetElement("form-field", Attributes = "for")]
public class FormFieldTagHelper : TagHelper
{
[HtmlAttributeName("for")]
public ModelExpression For { get; set; }
private readonly IHtmlGenerator _generator;
[ViewContext]
public ViewContext ViewContext { get; set; }
public FormFieldTagHelper(IHtmlGenerator generator)
{
_generator = generator;
}
public override void Process(TagHelperContext context, TagHelperOutput output)
{
using (var writer = new StringWriter())
{
writer.Write(@"<div class=""form-group"">");
var label = _generator.GenerateLabel(
ViewContext,
For.ModelExplorer,
For.Name, null,
new { @class = "control-label" });
label.WriteTo(writer, NullHtmlEncoder.Default);
writer.Write(@"<span message=""description.""></span>");
var textArea = _generator.GenerateTextBox(ViewContext,
For.ModelExplorer,
For.Name,
For.Model,
null,
new { @class = "form-control" });
textArea.WriteTo(writer, NullHtmlEncoder.Default);
var validationMsg = _generator.GenerateValidationMessage(
ViewContext,
For.ModelExplorer,
For.Name,
null,
ViewContext.ValidationMessageElement,
new { @class = "text-danger" });
validationMsg.WriteTo(writer, NullHtmlEncoder.Default);
writer.Write(@"</div>");
output.Content.SetHtmlContent(writer.ToString());
}
}
}
看法:
<form-field for="ManagerName"></form-field>
结果:
关于asp.net-core - ASP.NET Core- 有没有办法使用自定义标签助手呈现一组元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59796404/