2011-02-11 10 views
7

मैं एक कस्टम HTML.LabelFor सहायक है कि इस तरह दिखता है निर्माण कर रहा हूँ वर्णन विशेषता:निकालें प्रदर्शन नाम और एक HTML सहायक के भीतर से

public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> self, Expression<Func<TModel, TValue>> expression, Boolean showToolTip) 
{ 
    var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData); 
    ... 
} 

संपत्ति के लिए उचित नाम पाने के लिए मैं निम्नलिखित कोड का उपयोग कर रहा सक्षम होने के लिए :

metadata.DisplayName 

और ModelView वर्ग मुझे मिल की संपत्ति पर:

[DisplayName("Titel")] 

समस्या यह है कि मुझे एक विवरण की भी आवश्यकता है। डिस्प्ले नामक एक विशेषता है और इसमें नाम और विवरण है लेकिन मुझे नहीं लगता कि उपर्युक्त कोड में मेटाडेटा चर के साथ इसे कैसे निकाला जाए?

उत्तर

19

अस्वीकरण: केवल ASP.NET MVC 3 के साथ निम्न काम करता है (नीचे अद्यतन देखें कि वह आपके पिछले संस्करणों का उपयोग कर रहे हैं)

निम्नलिखित मॉडल मानते हुए:

public class MyViewModel 
{ 
    [Display(Description = "some description", Name = "some name")] 
    public string SomeProperty { get; set; } 
} 

और निम्न दृश्य :

:

<%= Html.LabelFor(x => x.SomeProperty, true) %> 

अपने कस्टम सहायक के अंदर आप मेटाडाटा से इस जानकारी को लाने सकता है

public static MvcHtmlString LabelFor<TModel, TValue>(
    this HtmlHelper<TModel> self, 
    Expression<Func<TModel, TValue>> expression, 
    bool showToolTip 
) 
{ 
    var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData); 
    var description = metadata.Description; // will equal "some description" 
    var name = metadata.DisplayName; // will equal "some name" 
    // TODO: do something with the name and the description 
    ... 
} 

टिप्पणी: एक ही मॉडल की संपत्ति पर [DisplayName("foo")] और [Display(Name = "bar")] होने अनावश्यक है और [Display] विशेषता में प्रयोग किया जाता नाम metadata.DisplayName में प्राथमिकता दी है।


अद्यतन:

मेरे पिछले जवाब ASP.NET MVC 2.0 के साथ काम नहीं करेगा। गुणों के एक जोड़े हैं कि .NET 3.5 में DataAnnotations के साथ डिफ़ॉल्ट रूप से भरना संभव नहीं है, और Description उनमें से एक है।

public class DisplayMetaDataProvider : DataAnnotationsModelMetadataProvider 
{ 
    protected override ModelMetadata CreateMetadata(
     IEnumerable<Attribute> attributes, 
     Type containerType, 
     Func<object> modelAccessor, 
     Type modelType, 
     string propertyName 
    ) 
    { 
     var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); 

     var displayAttribute = attributes.OfType<DisplayAttribute>().FirstOrDefault(); 
     if (displayAttribute != null) 
     { 
      metadata.Description = displayAttribute.Description; 
      metadata.DisplayName = displayAttribute.Name; 
     } 
     return metadata; 
    } 
} 

जो आप Application_Start में रजिस्टर होगा:: ASP.NET में इस लक्ष्य को पूरा MVC 2.0 आप एक कस्टम मॉडल मेटाडाटा प्रदाता इस्तेमाल कर सकते हैं

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    RegisterRoutes(RouteTable.Routes); 
    ModelMetadataProviders.Current = new DisplayMetaDataProvider(); 
} 

और फिर सहायक अपेक्षा के अनुरूप काम करना चाहिए:

public static MvcHtmlString LabelFor<TModel, TValue>(
    this HtmlHelper<TModel> self, 
    Expression<Func<TModel, TValue>> expression, 
    bool showToolTip 
) 
{ 
    var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData); 
    var description = metadata.Description; // will equal "some description" 
    var name = metadata.DisplayName; // will equal "some name" 
    // TODO: do something with the name and the description 
    ... 
} 
+0

धन्यवाद! लेकिन यह काम नहीं कर रहा है, प्रदर्शन नाम और विवरण शून्य है? कृपया ध्यान दें कि यह एमवीसी 2 में है और एमवीसी 3 नहीं है। अगर मुझे यह सही लगता है तो आपका समाधान केवल एमवीसी 3 में काम करेगा? – Banshee

+0

@SnowJim, हां, गुणों के एक जोड़े हैं कि .NET 3.5 में 'DataAnnotations' के साथ डिफ़ॉल्ट रूप से भरना संभव नहीं है, और विवरण उनमें से एक है। .NET 4.0 में इसे काम करना चाहिए। –

+1

@SnowJim, कृपया एएसपी.नेट एमवीसी 2 में एक वर्कअराउंड के लिए मेरा अद्यतन देखें। –

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