2012-01-19 32 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

是的,這可能與標準助手(ValidationSummaryValidationMessageFor)無關。如果你想達到這個目的,你將不得不編寫一個自定義幫助器來渲染這些消息。您可以查看following post,查看如何編寫自定義ValidationSummary幫助程序的示例,該幫助程序不會將HTML錯誤消息編碼爲標準錯誤消息。

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

另一種方法是將驗證項放入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

另一個問題是無法通過htmlAttributes添加額外的類,因爲TagBuilder.MergeAttributes不合並屬性值。這可以通過合併屬性來設置驗證類後使用TagBuilder.AddCssClass來解決。