2012-06-10 16 views
23

में कस्टम एचटीएमएल हेल्पर्स से विशेषताओं तक पहुंचने के लिए मैंने एएसपीनेट एमवीसी 4 रेज़र व्यू इंजन सी # में एचटीएमएलहेल्पर बनाया है।एएसपीनेट एमवीसी 4 रेज़र

क्या मैं अपने सहायक वर्ग में दृश्य मॉडल संपत्ति पास कर सकता हूं?

उदाहरण के लिए, मैं संपत्ति

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

मैं इस संपत्ति इस @ Html.Example की तरह मेरे सहायक कुछ (मॉडल => model.Lastname) के लिए सहायक में डेटा एनोटेशन मिल (यह तब गुजरती हैं और से कर सकते है फ़ील्ड आवश्यक है कि प्रदर्शन नाम और आदि क्या है)?

धन्यवाद

उत्तर

38

[Display] विशेषता मेटाडाटा समृद्ध। तो आप मेटाडेटा से जानकारी प्राप्त कर सकते हैं।

उदाहरण के लिए यदि आप सहायक अंदर प्रदर्शन नाम को पुनः प्राप्त करना चाहता था:

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

और फिर अगर हम यह मान आप एक दृश्य मॉडल है कि:

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

आप में सहायक इस्तेमाल कर सकते हैं आपका दृढ़ता से टाइप किया गया दृश्य:

@model MyViewModel 

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

अब मान लीजिए कि आपने कस्टम मेटाडेटा लिखा है श्रद्धांजलि:

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

है कि आप के साथ अपने मॉडल को सजाने के लिए इस्तेमाल किया:

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

और फिर अपने सहायक के अंदर आप कस्टम विशेषता लाने सकता है:

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

अद्यतन:

ऐसा लगता है कि आप एन आवश्यक संदेश लाने के लिए eed।

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

वाह: नहीं विचार क्यों आप एक कस्टम सहायक में यह कर, लेकिन यहाँ की जरूरत है एक उदाहरण आपको लगता है कि कैसे प्राप्त कर सकते है। मुझे लगता है कि आप कमाल हैं :) आपको –

+0

धन्यवाद और क्या आप कह सकते हैं कि मैं डेटा-वैल-आवश्यक संदेश कैसे प्राप्त कर सकता हूं? मैं यह messagess प्राप्त करना चाहता हूं >>> डेटा-वैल-डेट = "फ़ील्ड जन्मदिन एक तिथि होना चाहिए।" डेटा-वैल-आवश्यक = "जन्मदिन फ़ील्ड आवश्यक है। –

+0

'डेटा-वैल-आवश्यक' क्लाइंट साइड विशेषता है। मुझे लगता है कि आप आवश्यक विशेषता द्वारा उपयोग किए गए संदेश को प्राप्त करना चाहते हैं। मैं अपना उत्तर एक के साथ अपडेट करूंगा उदाहरण। –

संबंधित मुद्दे