我的一条错误消息呈现了一个链接。但是,Html.ValidationSummary()
会对其进行编码,因此显示如下:
您指定的手机或电子邮件帐户已存在。 如果您忘记了密码,请< a HREF = “/帐户/复位” >复位< / A>它
相反,它应呈现为:
您指定的手机或电子邮件帐户已存在。 如果您忘记了密码,请重置密码。
错误被添加到ModelState内部视图中,如下所示:
if (...)
{
ViewData.ModelState.AddModelError(string.Empty, string.Format("An account with the mobile or email you have specified already exists. If you have forgotten your password, please {0} it.", Html.ActionLink("Reset", "Reset")));
}
简而言之,我应该如何阻止Html.ValidationSummarry()
选择性/完全编码错误中的html。
答案 0 :(得分:3)
用于显示错误消息的当前HTML帮助程序不支持此操作。但是,您可以编写自己的HTML帮助程序,在没有HTML转义的情况下显示错误消息,即他们会将错误消息视为原始HTML。
作为起点,您可以使用Codeplex中的ASP.NET MVC源代码,特别是ValidationSummary
类的ValidationExtensions
方法:
public static string ValidationSummary(this HtmlHelper htmlHelper, string message, IDictionary<string, object> htmlAttributes) {
// Nothing to do if there aren't any errors
if (htmlHelper.ViewData.ModelState.IsValid) {
return null;
}
string messageSpan;
if (!String.IsNullOrEmpty(message)) {
TagBuilder spanTag = new TagBuilder("span");
spanTag.MergeAttributes(htmlAttributes);
spanTag.MergeAttribute("class", HtmlHelper.ValidationSummaryCssClassName);
spanTag.SetInnerText(message);
messageSpan = spanTag.ToString(TagRenderMode.Normal) + Environment.NewLine;
}
else {
messageSpan = null;
}
StringBuilder htmlSummary = new StringBuilder();
TagBuilder unorderedList = new TagBuilder("ul");
unorderedList.MergeAttributes(htmlAttributes);
unorderedList.MergeAttribute("class", HtmlHelper.ValidationSummaryCssClassName);
foreach (ModelState modelState in htmlHelper.ViewData.ModelState.Values) {
foreach (ModelError modelError in modelState.Errors) {
string errorText = GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelError, null /* modelState */);
if (!String.IsNullOrEmpty(errorText)) {
TagBuilder listItem = new TagBuilder("li");
listItem.SetInnerText(errorText);
htmlSummary.AppendLine(listItem.ToString(TagRenderMode.Normal));
}
}
}
unorderedList.InnerHtml = htmlSummary.ToString();
return messageSpan + unorderedList.ToString(TagRenderMode.Normal);
}
然后,您可以更改此方法以将错误消息视为原始HTML。
但有两个警告:
您正在更改ModelState
类的某些属性的含义。当您现在使用自己的HTML帮助程序时,未来版本的ASP.NET MVC可能会引入不再适用于此方法的更改。
请注意不要使用未正确转义的错误消息,这样就不会将您的网络应用暴露给XSS攻击。某些标准验证注释可能不再起作用,因为它们没有HTML转义错误消息。