2010-12-18 14 views
5

में मॉडलों के संग्रह से डेटा एनाटोटेशन पढ़ें मेरे एमवीसी 2 एडमिन एरिया में मैं अपने प्रत्येक डोमेन मॉडल के लिए एक सिंहावलोकन तालिका बनाना चाहता हूं। मैं उन डोमेन मॉडल वस्तुओं के गुणों के लिए निम्नलिखित की तरह DataAnnotations उपयोग कर रहा हूँ:एमसीवी 2 व्यू

[DisplayName("MyPropertyName")] 
public string Name { get; set; } 

अब मेरे सवाल है: मैं उपयोग कर सकते हैं कैसे DisplayName गुण मेरे विचार मेरे डोमेन मॉडल का एक संग्रह प्राप्त करता है तो क्या होगा? मुझे टेबल हेडर बनाने के लिए इसकी आवश्यकता है जिसे सामान्य

<% foreach (var item in Model) { %> 

लूप के बाहर परिभाषित किया गया है। इस लूप के अंदर मैं

<%: Html.LabelFor(c => item.Name) %> 

पर विचार कर सकता हूं लेकिन क्या इस जानकारी को ठोस उदाहरण के बजाय वस्तुओं के संग्रह का उपयोग करके एक्सेस करने का कोई तरीका है?

अग्रिम धन्यवाद!

+0

क्या आपका मॉडल पूरी तरह टाइप किया गया है, जैसे 'सूची '? – marcind

+0

हां, यह एक आईनेमेरेबल है। – Shackles

उत्तर

2

ModelMetaData कक्षा है जिसमें एक स्थिर विधि है जिसे FromLambdaExpression कहा जाता है। यदि आप इसे ViewData के साथ कॉल करते हैं और अपनी संपत्ति में पास करते हैं, तो यह ModelMetaData का उदाहरण देगा। उस वर्ग में DisplayName संपत्ति है जो आपको जो चाहिए वह आपको देनी चाहिए। आप इस ऑब्जेक्ट से अन्य मेटा डेटा जानकारी भी प्राप्त कर सकते हैं।

उदाहरण के लिए, आप इस जानकारी को प्राप्त करने के लिए खाली ViewDataDictionary ऑब्जेक्ट बना सकते हैं। यह खाली हो सकता है क्योंकि ModelMetaData वास्तव में उदाहरण का उपयोग नहीं करता है, इसे उपयोग किए जाने वाले प्रकार को परिभाषित करने के लिए केवल सामान्य वर्ग की आवश्यकता होती है।

//This would typically be just your view model data.  
ViewDataDictionary<IEnumerable<Person>> data = new ViewDataDictionary<IEnumerable<Person>>(); 

ModelMetadata result = ModelMetadata.FromLambdaExpression(p => p.First().Name, data); 
string displayName = result.DisplayName; 

First() विधि कॉल भी नष्ट नहीं होती है यदि आप कोई वास्तविक Person वस्तु है क्योंकि लैम्ब्डा बस संपत्ति के बारे में आप मेटा डेटा चाहते हैं खोजने की कोशिश कर रहा है। इसी तरह, आप घ एक भी Person वस्तु के लिए इस सकता है:

//This would typically be just your view model data.  
ViewDataDictionary<Person> data = new ViewDataDictionary<Person>(); 

ModelMetadata result = ModelMetadata.FromLambdaExpression(p => p.Name, data); 

आप इस ऊपर काफी एक सहायक या विस्तार विधि के साथ साफ कर सकते हैं, लेकिन यह सही रास्ते पर डाल देना चाहिए।

+0

आपके उत्तर के लिए धन्यवाद। यह ठीक काम करता है लेकिन मुझे आश्चर्य है कि क्या मैं इसे मॉडल गुणों के सेट के लिए स्वचालित रूप से कर सकता हूं (क्या मैं किसी भी तरह से सभी गुणों पर पुनरावृत्ति कर सकता हूं?)। मैं उन सभी प्रदर्शन नामों के साथ एक शब्दकोश नहीं बनाना चाहता हूं जो मैं अपने विचार में दिखाना चाहता हूं। – Shackles

0

ठीक है, मैं sgriffinusa की सलाह (धन्यवाद फिर से!) का पालन किया और एक जोरदार टाइप किया HtmlHelper बनाया:

public static MvcHtmlString MetaDisplayName<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) where TModel : class 
{ 
    ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
    return MvcHtmlString.Create(metadata.GetDisplayName()); 
} 
बेशक

TModel अभी भी डोमेन मॉडल का एक संग्रह मेरे inital सवाल में कहा गया है, लेकिन हम कर सकते हैं की तरह है इस तरह के दृश्य में सहायक को कॉल करें:

<%: Html.MetaDisplayName(p => p.First().Name) %>