MVC3 - передача NEW-LINE в ModelState.AddModelError - PullRequest
11 голосов
/ 16 ноября 2011

Когда на сервере возникает ошибка, контроллер MVC возвращает сообщение через
ModelState.AddModelError("", "message");

Я бы хотел, чтобы это «сообщение» отображалось в 2 строки , поэтому я хотел бы поместить "\r\n"
или "<br />" между ними.

Я использую Razor для отображенияСообщение с использованием @Html.ValidationSummary();
Но вывод HTML из представления отображает это как &lt;br/&gt;

Каков наилучший способ передать строки в сообщении и интерпретировать егов настоящий тег
на уровне вывода 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()))   

    ....
}

Ответы [ 4 ]

16 голосов
/ 17 ноября 2011

Помощник 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));
    }
}

и затем:

@Html.MyValidationSummary()

Следующая строка в нашем пользовательском помощнике явно не кодирует HTML:

liBuilder.InnerHtml = userErrorMessageOrDefault;

В оригинальном помощнике это выглядит так:

liBuilder.SetInnerText(userErrorMessageOrDefault);
10 голосов
/ 16 ноября 2011

Попробуйте обернуть итоги проверки в Html.Raw и Server.HtmlDecode, например:

@Html.Raw(Server.HtmlDecode(Html.ValidationSummary().ToString()))
3 голосов
/ 25 марта 2015

Контроллер:

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

Razor:

<span style="white-space: pre-line">@Html.ValidationSummary()</span>
1 голос
/ 18 декабря 2014

Это поздний ответ, однако это лучший результат, когда я использую Google, поэтому мое решение может кому-то помочь.

Я обошел проблему и добавил отдельную строку для каждой строки сообщения об ошибке.Отображает красиво.

Код контроллера:

    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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...