2012-01-19 13 views
1

フィールドの検証メッセージの一部としてリンクを表示しようとしています。私はデータを使用してい は、それを設定するには、カスタムエラーメッセージを持つ属性:MVC3のHTML.ValidationMessageForの内部にHTMLタグをレンダリングする

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

をしかし、それはレンダリング時にタグが脱出し、文字通り印刷されています。

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

ことが可能です一部としてリンクを持っています検証メッセージは正しく表示されますか?

誰もが興味を持っていた場合は、ここで私は正しい方向に私を指しているため

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

} 

おかげダーリンそれを達成する方法です。私はテンプレートとして使用したこともわかりましたCustomize Html.ValidationMessageFor doesn't work in client side

私はこれを初めて使っています。だから誰でも提案があれば投稿してください。 ありがとう!

答えて

2

はい、標準ヘルパー(ValidationSummaryおよびValidationMessageFor)では可能ですが、そうではありません。これらのメッセージをレンダリングするには、カスタムヘルパーを作成する必要があります。エラーメッセージを標準でHTMLエンコードしないカスタムValidationSummaryヘルパーを作成する方法の例については、following postを参照してください。

3

上記のコードは、クライアント側の検証に必要なタグを生成しないため、クライアント側の検証では機能しません。

はここでそれを行うこと、それを改良します:オリジナルのポストのための

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

おかげ - それは非常に有用でした!

+0

あなたの –

0

もう1つの方法は、検証項目をHtml.Rawの内部に置くことです。

@Html.Raw(Html.ValidationMessageFor(x => Model.MyProperty)) 

これは、提案と同じくらい良い方法ではありませんが、あなたが探しているものを達成する必要があります。

1

私はMVC4を使用していますので、MVC3については確かに言えません。

私の場合、<br>タグを挿入できる唯一の方法は、Jerodeのメソッドから始めることでしたが、メッセージ文字列にマーカーを置き、それをかみそりで置き換えなければなりませんでした。送信されたメッセージは"Line 1[BR]Line2"でした。かみそりは@Html.Raw(Html.ValidationMessageFor(x => Model.MyProperty).ToString().Replace("[BR]", "&lt;br&gt;"))

希望になりました。

0

@shycohenからの回答のビル:

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

     TagBuilder tag = new TagBuilder("span"); 

     tag.Attributes.Add("data-valmsg-for", name); 
     tag.Attributes.Add("data-valmsg-replace", "true"); 

     if (htmlAttributes != null) 
     { 
      tag.MergeAttributes((IDictionary<string, object>)HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); 
     } 

     tag.AddCssClass(HtmlHelper.ValidationMessageCssClassName); 

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

htmlAttributesパラメータは省略可能になりましおよび近い試合ValidationMessageForへの匿名のオブジェクトとして渡されます。

TagBuilder.MergeAttributesは属性値をマージしないため、もう1つの問題はhtmlAttributesで余分なクラスを追加できませんでした。これは、TagBuilder.AddCssClassの後にの属性をマージして検証クラスを設定した後に解決されます。

関連する問題