2012-06-10 6 views
23

ASP.NET mvc 4 traş makinesi görünümünde c motoru HtmlHelper oluşturdum.ASP.NET mvc 4 traş makinesi içinde Özel Html Yardımcıları'ndan özniteliklere erişme

Model model özelliğini yardımcı sınıfıma geçirebilir miyim?

Örneğin, ben bu eğer

[Required] 
[Display(Name = "Your Lastname")] 
public string Lastname { get; set; } 

I (yardımcı veri anotations olsun bu @ Html.Example gibi benim yardımcı bir şey (modele => model.Lastname) için bu özelliği geçmek ve daha Can özellik var alan adı, görünen ad ve vb.) gereklidir?

Teşekkür

cevap

38

[Display] nitelik meta zenginleştirir. Böylece bilgileri meta verilerden getirebilirsiniz. Eğer yardımcı içindeki görünen adını almak isterse

Örneğin

:

public static class HtmlHelpers 
{ 
    public static IHtmlString Example<TModel, TProperty>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TProperty>> ex 
    ) 
    { 
     var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData); 
     var displayName = metadata.DisplayName; 
     return new HtmlString(html.Encode(displayName)); 
    } 
} 

sonra ne zaman bir görünüm modeli olduğunu varsayarsak: sen yardımcı kullanabilirsiniz

public class MyViewModel 
{ 
    [Required] 
    [Display(Name = "Your Lastname")] 
    public string Lastname { get; set; } 
} 

yazdığınız görünüm:

@model MyViewModel 

@Html.Example(x => x.Lastname) 

Şimdi özel bir meta veri yazdığınızı varsayalım haraç:

public class FooBarAttribute : Attribute, IMetadataAware 
{ 
    public FooBarAttribute(string bar) 
    { 
     Bar = bar; 
    } 
    public string Bar { get; private set; } 

    public void OnMetadataCreated(ModelMetadata metadata) 
    { 
     metadata.AdditionalValues["foo"] = Bar; 
    } 
} 

sizinle modelinizi süslemek için kullanılan:

public class MyViewModel 
{ 
    [Required] 
    [FooBar("This is the bar")] 
    public string SomeBar { get; set; } 
} 

ve sonra yardımcı içerisindeki özel niteliğini alamadan:

public static class HtmlHelpers 
{ 
    public static IHtmlString Example<TModel, TProperty>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TProperty>> ex 
    ) 
    { 
     var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData); 
     if (metadata.AdditionalValues.ContainsKey("foo")) 
     { 
      var foo = metadata.AdditionalValues["foo"] as string; 
      return new HtmlString(html.Encode(foo)); 
     } 
     return MvcHtmlString.Empty; 
    } 
} 

GÜNCELLEME:

Görünüşe göre sen Gerekli mesajı almak için eed. Bunu neden özel bir yardımcıda yapmanız gerektiği konusunda bir fikriniz yok, ancak şu sonuca ulaşabilirsiniz:

public static class HtmlHelpers 
{ 
    public static IHtmlString Example<TModel, TProperty>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TProperty>> ex 
    ) 
    { 
     var me = (ex.Body as MemberExpression); 
     if (me != null) 
     { 
      var required = me 
       .Member 
       .GetCustomAttributes(typeof(RequiredAttribute), false) 
       .Cast<RequiredAttribute>() 
       .FirstOrDefault(); 
      if (required != null) 
      { 
       var msg = required.FormatErrorMessage(me.Member.Name); 
       return new HtmlString(html.Encode(msg)); 
      } 
     } 
     return MvcHtmlString.Empty; 
    } 
} 
+2

Wow. Bence harikasın :) Seni –

+0

'a yönlendir ve veri-değerli-gerekli mesajı nasıl bulabileceğimi söyleyebilir misin? Bu iletiyi almak istiyorum >>> data-val-date = "BirthDate alanı bir tarih olmalı." data-val-required = "BirthDate alanı gereklidir. –

+0

" veri-val-gerekli "bir istemci tarafı özniteliğidir.Ama gerekli öznitelik tarafından kullanılan iletiyi almak istiyorum sanırım. örnek –