ASP.net Core 2.1 MVC Validation Tag Helper - 输出HTML(即停止HTML编码)
ASP.net Core 2.1 MVC Validation Tag Helper - output HTML (ie stop HTML Encoding)
我有一个注册页面,如果用户输入一个已经注册的电子邮件地址,我需要输出一个 link 让他们登录验证消息。
但是,验证标签助手 HTML 编码错误消息,因此 link 显示为 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 link?
我在 Google 上找不到任何关于此的内容。
谢谢。
扩展验证消息标签助手
第一步是创建扩展现有验证消息标签助手的标签助手。您需要将其属性设置为 asp-validation-for
以便它被调用。
你还需要声明一个字段来表示你是否要输出raw 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>
免责声明:可能有 better/smarter 种方法,但这里只是我的 0.02。
我有一个注册页面,如果用户输入一个已经注册的电子邮件地址,我需要输出一个 link 让他们登录验证消息。
但是,验证标签助手 HTML 编码错误消息,因此 link 显示为 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 link?
我在 Google 上找不到任何关于此的内容。
谢谢。
扩展验证消息标签助手
第一步是创建扩展现有验证消息标签助手的标签助手。您需要将其属性设置为 asp-validation-for
以便它被调用。
你还需要声明一个字段来表示你是否要输出raw 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>
免责声明:可能有 better/smarter 种方法,但这里只是我的 0.02。