2011-10-28 11 views
5

में कस्टम एट्रिब्यूट वैल्यू नहीं मिल सकता है मैंने एचटीएमएल हेल्पर को एक विधि के साथ बढ़ाया है जिसे मॉडल की संपत्ति से एक विशेषता मूल्य की आवश्यकता है। इसलिए मैंने इस तरह के एक कस्टम विशेषता को परिभाषित किया है।एमवीसी 3 एचटीएमएल हेल्पर

public class ChangeLogFieldAttribute : Attribute { 
     public string FieldName { get; set; } 
    } 

यह मेरी मॉडल में इस तरह प्रयोग किया जाता है।

[Display(Name = "Style")] 
    [ChangeLogField(FieldName = "styleid")] 
    public string Style { get; set; } 

मेरी सहायक विधि में, मैं अगर विशेषता संपत्ति के लिए प्रयोग किया जाता है, मेरी विशेषता का FieldName मूल्य प्राप्त करने के लिए निम्न कोड मिल गया है।

 var itemName = ((MemberExpression)ex.Body).Member.Name; 

     var containerType = html.ViewData.ModelMetadata.ContainerType; 
     var attribute = ((ChangeLogFieldAttribute[])containerType.GetProperty(html.ViewData.ModelMetadata.PropertyName).GetCustomAttributes(typeof(ChangeLogFieldAttribute), false)).FirstOrDefault(); 
     if (attribute != null) { 
      itemName = attribute.FieldName; 
     } 

हालांकि, जब मैं इस कोड तक पहुंचता हूं, तो मुझे अपवाद मिलता है क्योंकि कंटेनर टाइप शून्य है।

मुझे यकीन है कि अगर मैं यह सही में से किसी कर रहा हूँ नहीं कर रहा हूँ, लेकिन मैं इतनी दूर पाने के लिए लगभग 4 विभिन्न स्रोतों से खींच लिया। यदि आप मेरी समस्या या विकल्प के लिए एक फिक्स का सुझाव दे सकते हैं, तो मैं आभारी रहूंगा।

धन्यवाद।

समाधान

मैं डैरिन दिमित्रोव के समाधान के लिए इस्तेमाल किया, हालांकि मुझे यह कुछ बदलाव करने के लिए किया था के साथ अद्यतन। मैंने जो जोड़ा है वह यहां है। मुझे विशेषता मेटाडेटा के अस्तित्व की जांच करनी थी और सब अच्छा था। सहायक अंदर

public class ChangeLogFieldAttribute : Attribute, IMetadataAware 
{ 
    public string FieldName { get; set; } 

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

और उसके बाद:

 var fieldName = ((MemberExpression)ex.Body).Member.Name; 

     var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData); 
     if (metadata.AdditionalValues.ContainsKey("fieldName")) { 
      fieldName = (string)metadata.AdditionalValues["fieldName"]; 
     } 
+0

एक संपत्ति नाम पाने के लिए आपको बजाय 'metadata.PropertyName' उपयोग कर सकते हैं '((MemberExpression) ex.Body) .Member.Name'। यह फ़ील्ड नामों के लिए काम नहीं करता है, हालांकि, और मुझे कोई भी 'फ़ील्डनाम' या '.MemberName' नहीं दिखाई देता है। –

उत्तर

11

आप विशेषता मेटाडाटा बारे में पता कर सकता है

var metadata = ModelMetadata.FromLambdaExpression(ex, htmlHelper.ViewData); 
var fieldName = metadata.AdditionalValues["fieldName"]; 
संबंधित मुद्दे