如何在通过Html.ValidationSummary()呈现的错误中显示链接等html元素

我的一条错误消息呈现链接。 但是, Html.ValidationSummary()编码,因此显示如下:

已存在您指定的移动电话或电子邮件的帐户。 如果您忘记了密码,请重置

相反,它应呈现为:

已存在您指定的移动电话或电子邮件的帐户。 如果您忘记了密码,请重置密码。

该错误将添加到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。

用于显示错误消息的当前HTML帮助程序不支持此操作。 但是,您可以编写自己的HTML帮助程序,在没有HTML转义的情况下显示错误消息,即他们会将错误消息视为原始HTML。

作为起点,您可以使用Codeplex中的ASP.NET MVC源代码,特别是ValidationExtensions类的ValidationSummary方法:

  public static string ValidationSummary(this HtmlHelper htmlHelper, string message, IDictionary 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。

但有两个警告:

  1. 您正在更改ModelState类的某些属性的含义。 当您现在使用自己的HTML帮助程序时,未来版本的ASP.NET MVC可能会引入不再适用于此方法的更改。

  2. 请注意不要使用未正确转义的错误消息,这样就不会将您的Web应用暴露给XSS攻击。 某些标准validation注释可能不再起作用,因为它们不会使HTML转义错误消息。