渲染HTML标签HTML.ValidationMessageFor内的MVC3 [英] Render HTML tags inside of HTML.ValidationMessageFor in MVC3

查看:130
本文介绍了渲染HTML标签HTML.ValidationMessageFor内的MVC3的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图展现一个链接作为一个字段验证消息的一部分。
我使用的数据与自定义错误消息属性来设置它:

I'm trying to show a link as part of the validation message for a field. I'm using data attributes with custom error messages to set it:

[Required(ErrorMessage = "Message <a href='#'>link</a>")]
public string Field{ get; set; }

但是,当它呈现标签逃脱,从字面上打印:

But when it renders the tags are escaped and literally prints:

Message <a href='#'>link</a>

是否有可能有链接作为验证消息的一部分,但正确地呈现?

Is it possible to have the link as part of the validation message but render correctly?

如果任何人的兴趣,这里是我如何完成它

public static MvcHtmlString ValidationHTMLMessageFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
{
    return ValidationHTMLMessageFor(helper, expression, (object)null);
}
public static MvcHtmlString ValidationHTMLMessageFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
{
    return ValidationHTMLMessageFor(helper, expression, new RouteValueDictionary(htmlAttributes));
}
public static MvcHtmlString ValidationHTMLMessageFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes)
{
    string propertyName = ExpressionHelper.GetExpressionText(expression);
    string name = helper.AttributeEncode(helper.ViewData.TemplateInfo.GetFullHtmlFieldName(propertyName));

    if (helper.ViewData.ModelState[name] == null ||
        helper.ViewData.ModelState[name].Errors == null ||
        helper.ViewData.ModelState[name].Errors.Count == 0)
    {
        return MvcHtmlString.Empty;
    }

    string errors = "";
    foreach (ModelError error in helper.ViewData.ModelState[name].Errors)
    {
        TagBuilder tag = new TagBuilder("span");
        tag.Attributes.Add("class", HtmlHelper.ValidationMessageCssClassName);
        tag.MergeAttributes(htmlAttributes);
        tag.Attributes.Add("data-valmsg-for", name);
        tag.Attributes.Add("data-valmsg-replace", "true");

        var text = tag.ToString(TagRenderMode.StartTag);
        text += error.ErrorMessage;
        text += tag.ToString(TagRenderMode.EndTag);
        errors += text;
    }

    return MvcHtmlString.Create(errors);

}

感谢达林指着我在正确的方向。我也发现了这一点,我作为模板<一个href=\"http://stackoverflow.com/questions/8004105/customize-html-validationmessagefor-doesnt-work-in-client-side\">Customize Html.ValidationMessageFor不会在客户端工作。

我是新来这一点,因此,如果任何人有任何建议,请留言。
谢谢!

I'm new to this, so if anyone has any suggestions, please post. Thanks!

推荐答案

在code以上不与客户端验证工作,因为它不会产生对客户端验证所需的标签。

The code above doesn't work with client-side validation since it doesn't produce the tags required for client-side validation.

下面的就可以了,做了改进:

Here's an improvement on it that does that:

public static MvcHtmlString ValidationHTMLMessageFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes)
{
  string propertyName = ExpressionHelper.GetExpressionText(expression);
  string name = helper.AttributeEncode(helper.ViewData.TemplateInfo.GetFullHtmlFieldName(propertyName));

  TagBuilder tag = new TagBuilder("span");
  tag.Attributes.Add("class", HtmlHelper.ValidationMessageCssClassName);
  tag.MergeAttributes(htmlAttributes);
  tag.Attributes.Add("data-valmsg-for", name);
  tag.Attributes.Add("data-valmsg-replace", "true");
  var returnTag = new StringBuilder(tag.ToString(TagRenderMode.StartTag));

  if (helper.ViewData.ModelState[name] != null &&
      helper.ViewData.ModelState[name].Errors != null &&
      helper.ViewData.ModelState[name].Errors.Count > 0)
  {
    foreach (ModelError error in helper.ViewData.ModelState[name].Errors)
    {
      returnTag.Append(error.ErrorMessage);
    }
  }
  returnTag.Append(tag.ToString(TagRenderMode.EndTag));
  return MvcHtmlString.Create(returnTag.ToString());
}

感谢原来的职位 - 这是非常有益的。

Thanks for the original post - it was very helpful!

这篇关于渲染HTML标签HTML.ValidationMessageFor内的MVC3的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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