Я заметил в своем проекте, что все мои поля формы следуют одному и тому же шаблону. Типичный пример:
<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, который генерируется из тегов помощников. Я попробовал оба метода, и ни один не был успешным. Кроме того, я попытался создать функцию-бритву, но все мои попытки не скомпилировались, и я не могу заставить работать частичное представление, так как не смог найти способ получить информацию о свойстве после передачи строки в view.
Моей последней попыткой было использование помощника по тегам, однако эта проблема была упомянута ранее. Последняя версия кода выглядит следующим образом:
[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);
}
}
Существует проблема, решающая эту проблему ( без решения ), которая предполагает, что порядок импорта является потенциальной проблемой, поэтому мой импорт выглядит следующим образом:
@addTagHelper Project.Web.Features.Shared.*, Project.Web
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Приветствуется любое решение, как для помощника тега, так и для другого метода.