2011-06-17 60 views
5

我試圖在包含鏈接的MVC3中輸出驗證消息。如何防止MVC3 html轉義我的驗證消息?

我在輸出錯誤信息佔位這樣

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

的問題是,該錯誤信息是HTML逃脫這是很好的大部分時間,但我想一個鏈接,在中間。

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

如何防止這種情況發生?

這個工作,但不是一個解決方案,而是一個臨時工作。

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

回答

0

以@ BrunoLM的領先,下面的擴展方法應該給你你需要的。我只對此做過基本測試,但確實有效。

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

尋找與反射器的代碼似乎並不有一種方法爲,更完整的過載是:

public static MvcHtmlString ValidationMessageFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expression, 
    string validationMessage, 
    object htmlAttributes) 
{ 
    return htmlHelper.ValidationMessageFor<TModel, TProperty>(expression, validationMessage, ((IDictionary<string, object>) HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes))); 
} 

什麼,但是你可以做的是創建一個擴展方法返回你想要的字符串,像這樣:

public static class ValidationExtender 
{ 
    public static IHtmlString HtmlValidationMessageFor<TModel, TProperty>(
     this HtmlHelper<TModel> htmlHelper, 
     Expression<Func<TModel, TProperty>> expression) 
    { 
     return MvcHtmlString.Create(htmlHelper.ValidationMessageFor(expression).ToHtmlString()); 
    } 
} 

可以使用MvcHtmlString。見MvcHtmlString.Create()。它會輸出html而不會轉義。

+0

我實際上無法獲得此解決方案的工作。 MvcHtmlString類的唯一目的是轉義HTML代碼。從文檔「表示不應再次編碼的HTML編碼的字符串」。 – 2011-06-27 09:40:06