MVC3 - 将NEW-LINE传递给ModelState.AddModelError

SF *_*per 11 asp.net-mvc-3

当后端发生错误时,MVC控制器通过后端返回消息
ModelState.AddModelError("", "message");

我希望将这个"消息" 显示在2行中,所以我想在其间放一个 或一个."\r\n"
"<br />"

我正在使用Razor来显示消息@Html.ValidationSummary();
但是视图中的HTML输出显示为&lt;br/&gt;

在消息上传递New-Lines并将其解释为
HTML输出级别的真实标记的最佳方法是什么?

================================
控制器代码:

ModelState.AddModelError("", "Line one <br /> Line two.");
return Request.IsAjaxRequest() ? (ActionResult) PartialView("ViewName", model) 
            : View(model);
Run Code Online (Sandbox Code Playgroud)

查看代码:

@using (Ajax.BeginForm("Index", "Home", new AjaxOptions { UpdateTargetId = "tv" })) 
{
    @if (Html.ValidationSummary() != null)
        @Html.Raw(Server.HtmlDecode(Html.ValidationSummary(true).ToString()))   

    ....
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 16

ValidationSummary帮助程序HTML编码错误消息,这是设计使然.这意味着您不能使用HTML标记,因为它们将被编码.所以你可以编写一个不编码的自定义助手:

public static class ValidationExtensions
{
    public static IHtmlString MyValidationSummary(this HtmlHelper htmlHelper)
    {
        var formContextForClientValidation = htmlHelper.ViewContext.ClientValidationEnabled ? htmlHelper.ViewContext.FormContext : null;
        if (htmlHelper.ViewData.ModelState.IsValid)
        {
            if (formContextForClientValidation == null)
            {
                return null;
            }
            if (htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled)
            {
                return null;
            }
        }

        var stringBuilder = new StringBuilder();
        var ulBuilder = new TagBuilder("ul");

        ModelState modelState;
        if (htmlHelper.ViewData.ModelState.TryGetValue(htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix, out modelState))
        {
            foreach (ModelError error in modelState.Errors)
            {
                string userErrorMessageOrDefault = error.ErrorMessage;
                if (!string.IsNullOrEmpty(userErrorMessageOrDefault))
                {
                    var liBuilder = new TagBuilder("li");
                    liBuilder.InnerHtml = userErrorMessageOrDefault;
                    stringBuilder.AppendLine(liBuilder.ToString(TagRenderMode.Normal));
                }
            }
        }

        if (stringBuilder.Length == 0)
        {
            stringBuilder.AppendLine("<li style=\"display:none\"></li>");
        }
        ulBuilder.InnerHtml = stringBuilder.ToString();

        TagBuilder divBuilder = new TagBuilder("div");
        divBuilder.AddCssClass(htmlHelper.ViewData.ModelState.IsValid ? HtmlHelper.ValidationSummaryValidCssClassName : HtmlHelper.ValidationSummaryCssClassName);
        divBuilder.InnerHtml = ulBuilder.ToString(TagRenderMode.Normal);
        if (formContextForClientValidation != null)
        {
            if (!htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled)
            {
                divBuilder.GenerateId("validationSummary");
                formContextForClientValidation.ValidationSummaryId = divBuilder.Attributes["id"];
                formContextForClientValidation.ReplaceValidationSummary = false;
            }
        }
        return new HtmlString(divBuilder.ToString(TagRenderMode.Normal));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

@Html.MyValidationSummary()
Run Code Online (Sandbox Code Playgroud)

它是我们的自定义助手中的以下行,它显式不进行HTML编码:

liBuilder.InnerHtml = userErrorMessageOrDefault;
Run Code Online (Sandbox Code Playgroud)

在原始助手中,它看起来像这样:

liBuilder.SetInnerText(userErrorMessageOrDefault);
Run Code Online (Sandbox Code Playgroud)


cou*_*ben 10

尝试将验证摘要包装在a Html.Raw和a中Server.HtmlDecode,如下所示:

@Html.Raw(Server.HtmlDecode(Html.ValidationSummary().ToString()))
Run Code Online (Sandbox Code Playgroud)

  • 对我有用!`@Html.Raw(Server.HtmlDecode(Html.ValidationSummary(true, "", new { @class = "text-danger" }).ToString()))` (2认同)