Как добавить изображения в сводку проверки вместе с сообщением об ошибке? - PullRequest
3 голосов
/ 12 июля 2011

Я хочу отобразить сообщение об ошибке с изображением успеха (зеленая галочка) и изображением ошибки (красное предупреждение) в сводке проверки. как это сделать и в итоговой проверке я должен отобразить текст жирным шрифтом, курсивом и т. д., для этого я попытался передать строку следующим образом.

inValid <b>username</b> or <b>password</b>

Но на странице его рендеринг как есть. имя пользователя и пароль не отображаются жирным шрифтом. Есть ли способ сделать это. Я получаю сообщения об ошибках проверки в контроллере и добавляю их в ModelState.add (error);

Ответы [ 2 ]

6 голосов
/ 12 июля 2011

Помощник ValidationSummary HTML по умолчанию кодирует все сообщения.Вы можете написать собственный помощник, который не кодирует 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.InnerHtml = message;
            messageSpan = spanTag.ToString(TagRenderMode.Normal) + Environment.NewLine;
        }
        else
        {
            messageSpan = null;
        }

        var htmlSummary = new StringBuilder();
        var unorderedList = new TagBuilder("ul");

        IEnumerable<ModelState> 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)
                {
                    var errorText = modelError.ErrorMessage;
                    if (!String.IsNullOrEmpty(errorText))
                    {
                        var listItem = new TagBuilder("li");
                        listItem.InnerHtml = errorText;
                        htmlSummary.AppendLine(listItem.ToString(TagRenderMode.Normal));
                    }
                }
            }
        }

        if (htmlSummary.Length == 0)
        {
            htmlSummary.AppendLine(@"<li style=""display:none""></li>");
        }

        unorderedList.InnerHtml = htmlSummary.ToString();

        var 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(TagRenderMode.Normal));
    }
}

Теперь у вас есть возможность использовать теги HTML в ваших сообщениях проверки:

ModelState.AddModelError("user", "invalid <b>username</b> or <b>password</b>");

, а затем:

<%= Html.MyValidationSummary(true, null) %>

Очевидно, что при этом вы должны убедиться, что ваши сообщения об ошибках содержат правильную структуру HTML.

0 голосов
/ 05 мая 2012

Нет сомнений, что ответ @ Darin Dimitrov - лучшая практика.но как новичок я получаю эту функциональность, используя ViewBag
Внутри Controller

if(true) //All is well and success msg is to be sent
{
     ViewBag.Errors = null;
     ViewBag.Success = "<b>Login</b> is Successful";

     //Redirect
}
else
{
     ViewBag.Errors = "<b>Some Error messages</b>";
     ViewBag.Success = null;
 }

Внутри View()

@if(ViewBag.Errors != null)
{
     <div class="error">@Html.Raw(@ViewBag.Errors)</div>
}

@if(ViewBag.Success != null)
{
     <div class="success">@Html.Raw(@ViewBag.Success)</div>
}

Теперь Css

.error { color: red; background-image:error_image.png; }
.success { color:green; background-image : success_image.png; }
...