2010-10-28 7 views
5

निम्नलिखित कोड है कि मैं जब एक दृश्य में एक तालिका के अंदर एक ग्राहक के डाक पते प्रदर्शित उपयोग कर रहा हूँ पर विचार करें:एएसपी.नेट एमवीसी/सी #: क्या मैं खुद को एक-पंक्ति सी # सशर्त कथन में दोहराने से बच सकता हूं?

<%: Customer.MailingAddress == null ? "" : Customer.MailingAddress.City %> 

मैं अपने आप को इन त्रिगुट सशर्त बयान का एक उचित राशि का उपयोग खोजने के लिए और अगर वहाँ मैं सोच रहा हूँ इस स्थिति में मूल्यांकन किए जा रहे ऑब्जेक्ट को वापस संदर्भित करने का एक तरीका ताकि मैं इसे अभिव्यक्ति में उपयोग कर सकूं। ऐसा कुछ, शायद:

<%: Customer.MailingAddress == null ? "" : {0}.City %> 

क्या ऐसा कुछ मौजूद है? मुझे पता है कि मैं मान रखने के लिए एक चर बना सकता हूं लेकिन दृश्य पृष्ठों में सब कुछ एक कड़े छोटे कथन के अंदर रखना अच्छा लगेगा।

धन्यवाद!

उत्तर

2
:

public static TValue GetSafe<T, TValue>(this T obj, Func<T, TValue> propertyExtractor) 
where T : class 
{ 
    if (obj != null) 
    { 
     return propertyExtractor(obj); 
    } 

    return null; 
} 

और उपयोग इस तरह होगा

नहीं, कोई रास्ता नहीं है ठीक करना क्या आप एक चर बनाने या अपने आप को डुप्लिकेट के बिना पूछ रहे हैं, हालांकि आप कुछ इस तरह कर सकते हैं:

(Customer.MailingAddress ?? new MailingAddress()).City ?? string.Empty 

यह मानती है कि एक नया MailingAddress यह शहर संपत्ति/क्षेत्र डिफ़ॉल्ट रूप से अशक्त है होगा।

नया मेलिंग एड्रेस बनाने पर आखिरी शून्य कोलेसेन्स हटाया जा सकता है, शहर के क्षेत्र/संपत्ति को खाली स्ट्रिंग में प्रारंभ करता है।

लेकिन यह वास्तव में छोटा नहीं है, और यह अधिक हैकिश (मेरी राय में), और लगभग निश्चित रूप से कम प्रदर्शन करने वाला है।

+2

+1 ऐसा नहीं है क्योंकि मैं इसका उपयोग करता हूं, लेकिन मुझे लगता है कि यह चेनिंग का उपयोग कैसे करता है :-) –

+2

मुझे नहीं लगता कि यह वास्तव में ओपी चाहता है जो करने के लिए काम करेगा। अगर ग्राहक। मेलिंग एड्रेस शून्य नहीं है, तो कथन का परिणाम ऑब्जेक्ट ग्राहक है। मेलिंग एड्रेस, लेकिन उपयोगकर्ता चाहता है कि उस ऑब्जेक्ट की सिटी प्रॉपर्टी ऑब्जेक्ट न हो। –

+1

@ एडम पोराड। यह सच नहीं है। परिणाम पहले पेरेंट ब्लॉक का ** हमेशा एक dereferencable MailingAddress है। फिर हमें उस मेलिंग एड्रेस की सिटी प्रॉपर्टी/फ़ील्ड मिलती है (और यदि आवश्यक हो तो इसे कमजोर करें)। – McKay

2

आप ?? ऑपरेटर का उपयोग नल के साथ तुलना के लिए कर सकते हैं।

Customer.MailingAddress == null ? "" : Customer.MailingAddress; 

से ऊपर निम्नलिखित के रूप में लिखा जा सकता है:

Customer.MailingAddress ?? ""; 

अपने मामले मैं आमतौर पर विस्तार विधि बनाने में:

Customer.GetSafe(c => c.MailingAddress).GetSafe(ma => ma.City) ?? string.Empty 
+0

शून्य कोलेसिंग ऑपरेटर यहां व्यावहारिक नहीं होगा। –

+0

अद्यतन उत्तर। –

+0

एक अभिनव समाधान के लिए सभी सम्मानित सम्मान, लेकिन यह एक सशर्त ऑपरेटर में एक प्रकार के नाम की पुनरावृत्ति से बचने के लिए बहुत अधिक ओवरहेड (और आर्केन सिंटैक्स) है ... –

2

क्यों ग्राहक ऑब्जेक्ट पर कोई संपत्ति नहीं बनाती जिसमें उस स्थिति को शामिल किया गया है और बस इसे सीधे कॉल करें? अर्थात

Customer.FormattedMailingAddress 

मैं कोड लिखने हैं, लेकिन मैं अपने मोबाइल पर हूँ, आप केवल get{} अंदर एक ही शर्त डाल करने के लिए हालांकि आवश्यकता होगी।

+0

मैं मानता हूं कि यह एक अच्छा तरीका है, मैं बस सोच रहा था कि मैं जो पूछ रहा था वह संभव था या उदाहरण के लिए नहीं, जहां मैं अतिरिक्त संपत्ति नहीं जोड़ना चाहता हूं। –

+0

मेरी प्रोजेक्ट (.net4 और mvc2) के लिए हम वर्णित पैटर्न का पालन करते हैं, और ऑब्जेक्ट्स पर यह सब (प्रदर्शन स्ट्रिंग स्वरूपण) करते हैं। मुझे सिर्फ एक दृश्य से संपत्ति को कॉल करने में सक्षम होना पसंद है, और खुद को विचारों में किसी भी अनावश्यक तर्क (बिल्कुल) के बारे में चिंता न करें। हालांकि यह स्वाद का मामला है, और मुझे उम्मीद है कि मेरा सुझाव कम से कम मदद करता है। – Dave

+0

मुझे यह भी कहना चाहिए, इसका मतलब है, जब एक संपत्ति का उपयोग कई विचारों में किया जाता है, तो यह उसी 'स्वरूपण' को बनाए रखता है (यानी एक वर्ष में विकसित एक पृष्ठ पर, यह विभिन्न तर्क का उपयोग नहीं करता है, एक अलग स्ट्रिंग का उत्पादन करता है, एक ही क्षेत्र के लिए, जब तक यह जानबूझकर नहीं है :)) – Dave

1

मैं @ डेव से सहमत हूं, अपने ग्राहक वर्ग के लिए एक एक्सटेंशन बनाएं।

कुछ इस तरह:

public static class CustomerExtension 
{ 
    public static string DisplayCity(this Customer customer) 
    { 
     return customer.MailingAddress == null ? String.Empty : customer.MailingAddress.City 
    } 
} 

तो फिर तुम इस तरह अपने विधि कॉल कर सकते हैं:

myCustomer.DisplayCity(); 

(ध्यान दें: एक्सटेंशन एक संपत्ति के रूप में नहीं बनाया जा सकता, तो यह एक होना चाहिए था तरीका।अधिक जानकारी के लिए Does C# have extension properties? देखें)

1

आप मूल्य मिलता है या कोई रिक्त स्ट्रिंग वापस जाने के लिए एक विस्तार विधि बना सकते हैं:

public static string GetValue<T>(this T source, Func<T, string> getter) 
    { 
     if (source != null) 
      return getter(source); 

     return ""; 
    } 

तो यह कहते हैं:

<%: Customer.MailingAddress.GetValue(x=>x.City) %> 

यह किसी भी वस्तु के लिए काम करेगा ।

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