如何在AddModelError消息中包含一个链接?

我想添加一个ModelState错误,如下所示:

ModelState.AddModelError("", "Some message, click here) 

但是,链接不会被编码,因此显示为文本。 我试过用

 <%= Html.ValidationSummary(true, "Some message") 

代替

 <%: Html.ValidationSummary(true, "Some message") 

但没有运气。

任何人都知道如何让这个工作?

干杯

最简单的方法(也适用于MVC 4):

在控制器中:

 ModelState.AddModelError("", "Please click here"); 

在视图中:

 if (ViewData.ModelState.Any(x => x.Value.Errors.Any())) { @Html.Raw(HttpUtility.HtmlDecode(Html.ValidationSummary().ToHtmlString())) } 

ValidationSummary助手自动对所有消息进行HTML编码。 一种可能的解决方法是编写一个自定义validation摘要帮助程序,它不对消息进行HTML编码:

 public static class HtmlExtensions { public static MvcHtmlString MyValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors, string message) { var formContext = htmlHelper.ViewContext.ClientValidationEnabled ? htmlHelper.ViewContext.FormContext : null; if (formContext == null && htmlHelper.ViewData.ModelState.IsValid) { return null; } string messageSpan; if (!string.IsNullOrEmpty(message)) { TagBuilder spanTag = new TagBuilder("span"); spanTag.SetInnerText(message); messageSpan = spanTag.ToString(TagRenderMode.Normal) + Environment.NewLine; } else { messageSpan = null; } var htmlSummary = new StringBuilder(); TagBuilder unorderedList = new TagBuilder("ul"); IEnumerable modelStates = null; if (excludePropertyErrors) { ModelState ms; htmlHelper.ViewData.ModelState.TryGetValue(htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix, out ms); if (ms != null) { modelStates = new ModelState[] { ms }; } } else { modelStates = htmlHelper.ViewData.ModelState.Values; } if (modelStates != null) { foreach (ModelState modelState in modelStates) { 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.InnerHtml = errorText; htmlSummary.AppendLine(listItem.ToString(TagRenderMode.Normal)); } } } } if (htmlSummary.Length == 0) { htmlSummary.AppendLine(@"
  • "); } unorderedList.InnerHtml = htmlSummary.ToString(); TagBuilder divBuilder = new TagBuilder("div"); divBuilder.AddCssClass((htmlHelper.ViewData.ModelState.IsValid) ? HtmlHelper.ValidationSummaryValidCssClassName : HtmlHelper.ValidationSummaryCssClassName); divBuilder.InnerHtml = messageSpan + unorderedList.ToString(TagRenderMode.Normal); if (formContext != null) { // client val summaries need an ID divBuilder.GenerateId("validationSummary"); formContext.ValidationSummaryId = divBuilder.Attributes["id"]; formContext.ReplaceValidationSummary = !excludePropertyErrors; } return MvcHtmlString.Create(divBuilder.ToString()); } private static string GetUserErrorMessageOrDefault(HttpContextBase httpContext, ModelError error, ModelState modelState) { if (!String.IsNullOrEmpty(error.ErrorMessage)) { return error.ErrorMessage; } if (modelState == null) { return null; } string attemptedValue = (modelState.Value != null) ? modelState.Value.AttemptedValue : null; return String.Format(CultureInfo.CurrentCulture, "The value {0} is invalid.", attemptedValue); } }

    然后:

     <%= Html.MyValidationSummary(true, "Some message") %> 

    当然,通过这样做,您应该小心,因为您将这些错误消息放入文本中,因为现在它们不会被HTML编码。 这意味着如果您想在消息中使用某些特殊字符(如<>& ,则需要自己对其进行HTML编码,否则标记会中断。

     
      <% foreach(var error in ViewData.ModelState.Where(s => s.Value.Errors.Count!=0).SelectMany(s => s.Value.Errors)) { %>
    • <%= error.ErrorMessage %>
    • <% } %>

    或razor:

     
      @foreach(var error in ViewData.ModelState.Where(s => s.Value.Errors.Count!=0).SelectMany(s => s.Value.Errors)) {
    • @Html.Raw(error.ErrorMessage)
    • }