Расширение помощника тега сообщения проверки
Первым шагом является создание помощника тега, который расширяет существующий помощник тега сообщения проверки.Вам нужно установить его атрибут равным asp-validation-for
, чтобы он вызывался.
Вам также нужно объявить поле, чтобы указать, хотите ли вы выводить необработанный HTML или нет.Я назвал его OutputHtml
и обозначил имя атрибута как asp-validation-output-html
.
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace DL.SO.Framework.Mvc.TagHelpers
{
[HtmlTargetElement("span", Attributes = ForAttributeName)]
public class RawHtmlValidationMessageTagHelper : ValidationMessageHelper
{
private const string ForAttributeName = "asp-validation-for";
[HtmlAttributeName("asp-validation-output-html")]
public bool OutputHtml { get; set; }
public RawHtmlValidationMessageTagHelper(IHtmlGenerator generator) : base(generator) {}
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
await base.ProcessAsync(context, output);
if (this.OutputHtml)
{
using (var writer = new StringWriter())
{
output.WriteTo(writer, NullHtmlEncoder.Default);
output.Content.SetHtmlContent(writer.ToString());
}
}
}
}
}
Хитрость здесь заключается в том, чтобы использовать NullHtmlEncoder
для записи вывода помощника тега, без кодирования, сначала в устройство записи, а затемзаписать содержимое автора обратно в Html-содержимое тега-помощника.
В представлении
<form asp-action="Email">
<div class="form-group">
<label asp-for="Email" class="control-label"></label>
<input asp-for="Email" class="form-control" />
<span
asp-validation-for="Email"
asp-validation-output-html="true"
class="text-danger">
</span>
</div>
<div class="form-group">
<input type="submit" value="Continue" class="btn btn-default" />
</div>
</form>
Отказ от ответственности: Возможно, есть лучшие / более умные способы сделать это, но здесь естьтолько мой 0,02.