我如何prevent MVC3 HTML逃避我的验证消息? [英] How do I prevent MVC3 html escaping my validation messages?

查看:107
本文介绍了我如何prevent MVC3 HTML逃避我的验证消息?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图输出MVC3其中包含一个链接验证消息。

我在输出错误信息占位这样

  @ Html.ValidationMessageFor(型号=> model.Email)

问题是,该错误信息是HTML逃脱这是很好的大部分时间,但我想一个链接到在中间。

 <跨度类=现场验证错误数据valmsg换=电子邮件数据valmsg替换=真>这E-mail地址是已经临时用户。 &放大器; LT; A HREF =安培; QUOT;%url_token%放大器; QUOT;&安培; gt;点击这里重设和放大器; LT; / A&放大器; GT;< / SPAN>

我如何prevent这种情况发生?

这工作,但不是一个解决方案,而是一个临时的变通。

  @ {
  字符串s = Html.ValidationMessageFor(型号=> model.Email)的ToString();
}
@ Html.Raw(HttpUtility.HtmlDe code(S))


解决方案

考虑@ BrunoLM的带领下,下面的扩展方法应该给你你需要什么。我只是做了这个基本的测试,但它确实工作。

 公共静态类HtmlHelperExtensions
{
    私人静态只读字符串htmlErrorPlaceholder =## __ HTML#错误#占位符__ ##;    公共静态IHtmlString HtmlValidationMessageFor<的TModel,TProperty>(
        这与的HtmlHelper LT;的TModel>的HtmlHelper,
        防爆pression<&Func键LT;的TModel,TProperty>>前pression,
        对象htmlAttributes)
        {
            变量名称=前pression.GetMemberName();
            VAR isInError = htmlHelper.ViewContext.ViewData.ModelState.ContainsKey(名);
            VAR消息= htmlHelper.ValidationMessageFor(如pression,htmlErrorPlaceholder,htmlAttributes);
            如果(isInError&安培;&安培;!MvcHtmlString.IsNullOrEmpty(消息))
            {
                VAR realError = htmlHelper.ViewContext.ViewData.ModelState [名] .Errors.First()的ErrorMessage。
                返回htmlHelper.Raw(message.ToString()更换(htmlErrorPlaceholder,realError));
            }            返回MvcHtmlString.Empty;
        }
}公共静态类防爆pression_1Extensions
{
    公共静态字符串GetMemberName<的TModel,TProperty>(此例pression<&Func键LT;的TModel,TProperty>>前pression)
    {
        开关(如pression.Body.NodeType)
        {
            案例防爆pressionType.MemberAccess:
                MemberEx pression memberEx pression =(MemberEx pression)前pression.Body;
                返回memberEx pression.Member是的PropertyInfo? memberEx pression.Member.Name:空;
        }        抛出新NotSupportedException异常();
    }
}

I'm trying to output a validation message in MVC3 which contains a link.

I'm outputting the error message place holder like this

@Html.ValidationMessageFor(model => model.Email)

The problem is, the error message is html escaped which is fine most times, but I'd like a link to be in the middle.

<span class="field-validation-error" data-valmsg-for="Email" data-valmsg-replace="true">This e-mail address is already registed. &lt;a href=&quot;%url_token%&quot;&gt;Click here to reset.&lt;/a&gt;</span>

How do I prevent this from happening?

This works but is not a solution, rather, a temporary work around.

@{
  string s = Html.ValidationMessageFor(model => model.Email).ToString();
}
@Html.Raw(HttpUtility.HtmlDecode(s))

解决方案

Taking @BrunoLM's lead, The following extension methods should give you what you need. I've only done basic testing on this, but it does work.

public static class HtmlHelperExtensions
{
    private static readonly string htmlErrorPlaceholder = "##__html#Error#Placeholder__##";

    public static IHtmlString HtmlValidationMessageFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression,
        object htmlAttributes)
        {
            var name      = expression.GetMemberName();
            var isInError = htmlHelper.ViewContext.ViewData.ModelState.ContainsKey(name);
            var message   = htmlHelper.ValidationMessageFor(expression, htmlErrorPlaceholder, htmlAttributes);
            if (isInError && !MvcHtmlString.IsNullOrEmpty(message))
            {
                var realError = htmlHelper.ViewContext.ViewData.ModelState[name].Errors.First().ErrorMessage;
                return htmlHelper.Raw(message.ToString().Replace(htmlErrorPlaceholder, realError));
            }

            return MvcHtmlString.Empty;
        }
}

public static class Expression_1Extensions
{
    public static string GetMemberName<TModel, TProperty>(this Expression<Func<TModel, TProperty>> expression)
    {
        switch (expression.Body.NodeType)
        {
            case ExpressionType.MemberAccess:
                MemberExpression memberExpression = (MemberExpression)expression.Body;
                return memberExpression.Member is PropertyInfo ? memberExpression.Member.Name : null;
        }

        throw new NotSupportedException();
    }
}

这篇关于我如何prevent MVC3 HTML逃避我的验证消息?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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