ASP.net Core 2.1 MVC Validation Tag Helper - вывод HTML (т.е. остановка HTML-кодирования) - PullRequest
0 голосов
/ 10 октября 2018

У меня есть страница регистрации, если пользователь вводит адрес электронной почты, который уже зарегистрирован, мне нужно вывести ссылку для входа в него в сообщении проверки.

Однако помощники тега проверки HTML кодируют сообщения об ошибках,поэтому ссылка отображается как HTML.

В представлении:

@model Site.ViewModels.RegisterEmail
<h1>Register</h1>
<hr />
<div class="row">
    <div class="col-md-4">
        <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" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Continue" class="btn btn-default" />
            </div>
        </form>
    </div>
</div>

В контроллере:

var LoginLink = $"<a href='{Request.Scheme}://{Request.Host}{Request.PathBase}/Login'>Login</a>";


if (CustomerRepo.CustomerEmailExists(RegisterEmail.Email))
    ModelState.AddModelError("Email", $"Email already registered. {LoginLink} with your email, or register below");

Как я могу предотвратить кодировку HTML валидатора, илив противном случае правильно отобразить ссылку HTML в сообщении проверки?

Я не могу найти в Google ничего по этому поводу.

Спасибо.

1 Ответ

0 голосов
/ 17 октября 2018

Расширение помощника тега сообщения проверки

Первым шагом является создание помощника тега, который расширяет существующий помощник тега сообщения проверки.Вам нужно установить его атрибут равным 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.

...