2011-06-17 14 views
5

MVC3'te bir bağlantı içeren bir doğrulama mesajı çıkarmaya çalışıyorum.MVC3 html doğrulama iletilerimden nasıl kaçınılır?

Sorunun bu

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

gibi hata mesajı yer tutucu çıkışı ediyorum, hata mesajı html ince çoğu kez olduğu kaçtı, ama ortasında olmak için bir bağlantı istiyorum .

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

Bunun olmasını nasıl engellerim?

Bu işler, bir çözüm değil, geçici bir çalışmadır. reflektör ile koduna baktığımızda

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

cevap

0

@ BrunoLM'in ürününü ele alarak, aşağıdaki uzantı yöntemleri ihtiyacınız olanı vermelidir. Sadece bu konuda temel testler yaptım, ama işe yarıyor.

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

bunun için bir yöntem var görünmüyor, daha eksiksiz aşırı geçerli:

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

Ne Ancak yapabilirsiniz uzatma yöntemi yaratmak olduğunu

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

bir MvcHtmlString kullanabilirsiniz: böyle istediğiniz gibi dize döndürür. Bakınız MvcHtmlString.Create(). Kaçmadan html çıkacak.

+0

Aslında bu çözümü işe yaratamıyorum. MvcHtmlString sınıfının tek amacı HTML kodundan kurtulmaktır. Belgelerden "Yeniden kodlanmamış bir HTML kodlu dizeyi temsil eder." –

İlgili konular