Asp.net mvc 3 MVC3-将新行传递给ModelState.AddModelError

Asp.net mvc 3 MVC3-将新行传递给ModelState.AddModelError,asp.net-mvc-3,Asp.net Mvc 3,当后端出现错误时,MVC控制器通过 ModelState.AddModelError(“,”消息”) 我希望将该“消息”显示为两行,因此我希望在其中添加一个“\r\n” 或介于两者之间的“” 我使用Razor通过@Html.ValidationSummary()显示消息 但是视图的HTML输出显示为br/ 在消息上传递新行并在HTML输出级别将其解释为真正的标记的最佳方式是什么 ==================================================== 控制器代码:

当后端出现错误时,MVC控制器通过
ModelState.AddModelError(“,”消息”)

我希望将该“消息”显示为两行,因此我希望在其中添加一个“\r\n”

或介于两者之间的

我使用Razor通过
@Html.ValidationSummary()显示消息
但是视图的HTML输出显示为
br/

在消息上传递新行并在HTML输出级别将其解释为真正的
标记的最佳方式是什么

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

ModelState.AddModelError("", "Line one <br /> Line two.");
return Request.IsAjaxRequest() ? (ActionResult) PartialView("ViewName", model) 
            : View(model);
@using (Ajax.BeginForm("Index", "Home", new AjaxOptions { UpdateTargetId = "tv" })) 
{
    @if (Html.ValidationSummary() != null)
        @Html.Raw(Server.HtmlDecode(Html.ValidationSummary(true).ToString()))   

    ....
}

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

@Html.Raw(Server.HtmlDecode(Html.ValidationSummary().ToString()))

ValidationSummary helper 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));
    }
}
我们的自定义帮助程序中的以下行明确不进行HTML编码:

liBuilder.InnerHtml = userErrorMessageOrDefault;
在原始辅助对象中,它如下所示:

liBuilder.SetInnerText(userErrorMessageOrDefault);

这是一个迟来的答案,但是这是我在谷歌搜索时的最高结果,所以我的解决方案可能会帮助一些人

我绕过了这个问题,为每个错误消息行添加了一行。展示得很漂亮

控制器代码:

    public ActionResult Edit(EditModel model)
    {
            try
            {
                //... do update
            }
            catch (Exception ex)
            {
                if (ex.Message.Contains(Environment.NewLine))
                {
                    var messages = ex.Message.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
                    foreach (var message in messages)
                    {
                        this.ModelState.AddModelError(string.Empty, message);
                    }
                }
                else
                {
                    this.ModelState.AddModelError(string.Empty, ex.Message);
                }
            }
        //...

        return this.View(model);
    }
控制器:

ModelState.AddModelError("MyError", "Line 1" + Environment.NewLine + "Line 2");
剃刀:

<span style="white-space: pre-line">@Html.ValidationSummary()</span>
@Html.ValidationSummary()

请提供更多信息,您想做什么?ValidationSummary帮助程序会自动对消息进行HTML编码。如果你想实现这一点,你必须编写一个自定义的助手。当我把那行代码放进去时,它甚至没有显示部分视图。它给了我一个“500内部服务器错误”。我修改了我的答案。我测试了修改后的代码,当我在错误消息中出现

时,它返回了带换行符的错误消息;我试着用ViewBag.Temp.替换它,它确实起了作用。因此,在我们开始考虑完全替换它之前,我们需要找出如何使ValidationSummary工作。也许我在Ajax.BeginForm中有验证。那会有什么不同吗?对我有用
@Html.Raw(Server.HtmlDecode(Html.ValidationSummary(true,“,new{@class=“text danger”}).ToString())
如果每次你的答案中有一个帮助我摆脱困境,我就得到$a,我现在就不会工作了。真有用!谢谢你,达林,谢谢你的帮助!很好用!!此处建议的插入Environment.NewLine对我不起作用。@levteck有没有想过为什么它对我有效而对你无效?@MarioLevesque对我有效。确保像示例中那样对
span
元素进行样式化。如果使用AddModelError中的第一个参数键引用输入,则此操作无效
<span style="white-space: pre-line">@Html.ValidationSummary()</span>