如何包括AddModelError消息中的链接? [英] How to include a link in AddModelError message?

查看:148
本文介绍了如何包括AddModelError消息中的链接?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想添加的ModelState错误,像这样:

  ModelState.AddModelError(,一些消息,其中&; A HREF =/控制器/动作>点击此处< / A>)
 

但是,链接没有得到EN codeD,等等,显示像文本。我试图用

 <%= Html.ValidationSummary(真的,一些信息)
 

而不是

 <%:Html.ValidationSummary(真的,一些信息)
 

但没有运气。

任何人有任何想法如何得到这个工作?

干杯

解决方案

在ValidationSummary助手自动HTML连接codeS的所有消息。一个可能的解决方法是编写自定义的验证摘要帮手这不HTML连接code消息:

 公共静态类HtmlExtensions
{
    公共静态MvcHtmlString MyValidationSummary(这HtmlHelper的HtmlHelper的,布尔excludePropertyErrors,字符串消息)
    {
        VAR formContext = htmlHelper.ViewContext.ClientValidationEnabled? htmlHelper.ViewContext.FormContext:空;
        如果(formContext == NULL和放大器;&安培; htmlHelper.ViewData.ModelState.IsValid)
        {
            返回null;
        }

        串messageSpan;
        如果(!string.IsNullOrEmpty(消息))
        {
            TagBuilder spanTag =新TagBuilder(跨越);
            spanTag.SetInnerText(消息);
            messageSpan = spanTag.ToString(TagRenderMode.Normal)+ Environment.NewLine;
        }
        其他
        {
            messageSpan = NULL;
        }

        VAR htmlSummary =新的StringBuilder();
        TagBuilder unorderedList =新TagBuilder(UL);

        IEnumerable的<的ModelState> modelStates = NULL;
        如果(excludePropertyErrors)
        {
            的ModelState毫秒;
            htmlHelper.ViewData.ModelState.TryGetValue(htmlHelper.ViewData.TemplateInfo.HtmlField preFIX,出毫秒);
            如果(MS!= NULL)
            {
                modelStates =新的ModelState [] {MS};
            }
        }
        其他
        {
            modelStates = htmlHelper.ViewData.ModelState.Values​​;
        }

        如果(modelStates!= NULL)
        {
            的foreach(ModelState中的ModelState在modelStates)
            {
                的foreach(ModelError modelError在modelState.Errors)
                {
                    字符串ERRORTEXT = GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext,modelError,空/ * ModelState中* /);
                    如果(!String.IsNullOrEmpty(ERRORTEXT))
                    {
                        TagBuilder的listItem =新TagBuilder(礼);
                        listItem.InnerHtml = ERRORTEXT;
                        htmlSummary.AppendLine(listItem.ToString(TagRenderMode.Normal));
                    }
                }
            }
        }

        如果(htmlSummary.Length == 0)
        {
            htmlSummary.AppendLine(@<李作风=显示:无>< /李>);
        }

        unorderedList.InnerHtml = htmlSummary.ToString();

        TagBuilder divBuilder =新TagBuilder(分区);
        divBuilder.AddCssClass((htmlHelper.ViewData.ModelState.IsValid)HtmlHelper.ValidationSummaryValidCssClassName:HtmlHelper.ValidationSummaryCssClassName);
        divBuilder.InnerHtml = messageSpan + unorderedList.ToString(TagRenderMode.Normal);

        如果(formContext!= NULL)
        {
            //客户端VAL摘要需要一个ID
            divBuilder.GenerateId(的ValidationSummary);
            formContext.ValidationSummaryId = divBuilder.Attributes [ID];
            !formContext.ReplaceValidationSummary = excludePropertyErrors;
        }
        返回MvcHtmlString.Create(divBuilder.ToString());
    }

    私人静态字符串GetUserErrorMessageOrDefault(HttpContextBase HttpContext的,ModelError错误,ModelState中的ModelState)
    {
        如果(!String.IsNullOrEmpty(error.ErrorMessage))
        {
            返回error.ErrorMessage;
        }
        如果(ModelState中== NULL)
        {
            返回null;
        }

        字符串attemptedValue =(modelState.Value!= NULL)? modelState.Value.AttemptedValue:空;
        返回的String.Format(CultureInfo.CurrentCulture的值{0}是无效的。,attemptedValue);
    }
}
 

然后:

 <%= Html.MyValidationSummary(真的,一些信息)%>
 

当然做这个,你应该小心,因为你投入这些错误消息的文本内容和现在一样,他们不会是HTML连接$ C $的CD。这意味着,如果你曾经想用一些特殊字符,如< > &安培; 进入你的消息,你将需要HTML EN code自己或标记将打破

I want to add a ModelState error, like so:

ModelState.AddModelError("", "Some message, <a href="/controller/action">click here</a>)

However, the link doesn't get encoded, and so is displayed like text. I tried using

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

instead of

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

But no luck.

Anyone have any idea how to get this working?

Cheers

解决方案

The ValidationSummary helper automatically HTML encodes all messages. One possible workaround is to write a custom validation summary helper which doesn't HTML encode the messages:

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<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)
                {
                    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(@"<li style=""display:none""></li>");
        }

        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);
    }
}

and then:

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

Of course by doing this you should be careful as what text you are putting into those error messages as now they will not be HTML encoded. This means that if you ever wanted to use some special characters such as <, >, & into your message you will need to HTML encode it yourself or the markup will break.

这篇关于如何包括AddModelError消息中的链接?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆