6

मैं इस परिदृश्य के लिए अपनी राय और शायद बेहतर सुझाव सुनने के लिए करना चाहते हैं:ASP.NET MVC, ActionFilters, स्थिर वर्गों और आसपास गुजर डेटा

मुझे लगता है कि कुछ काम करता है और बाहर आता है एक कस्टम ActionFilter परिभाषित है कुछ मूल्य के साथ। मैं उस मान को नियंत्रक कार्यों और मॉडल में उपयोग करना चाहता हूं।

अब, मैं TempData का उपयोग किसी भी नियंत्रक कार्रवाई विधि के लिए ActionFilter से इस मूल्य पारित करने के लिए कर सकता है, तो सभी मॉडलों कि लौट आए विचारों के लिए पारित करने के लिए पर इस मूल्य वितरित करते हैं।

मुझे यकीन है कि यह काम करेगा हूँ लेकिन इस TempData सत्र कब और कहाँ कोई भी वास्तव में इसे अब और जरूरत में नहीं होगा। मूल्य को एक ही अनुरोध के समय कोड में विशेष रूप से उपयोग किया जाना चाहिए जिसके बाद यह प्रभावी रूप से अमान्य हो जाता है।)

  1. ActionFilter में, मैं यह मान TempData में OnActioExecuting() में स्थापित है और मैं OnActionExecuted में इसे हटाने (:

    मैं दो विकल्पों के साथ आए हैं। क्या मैं इसे सही ढंग से समझता हूं कि जब तक ऑनएक्शन एक्स्क्लेटेड कहा जाता है, नियंत्रक कार्रवाई समाप्त हो जाती है, प्रतिक्रिया पहले से ही उत्पन्न हो चुकी है और यह टेम्पपडेटा सामग्री ने सत्र सत्र में अपना रास्ता नहीं बनाया है?

  2. अपने कस्टम स्थिर कक्षाओं (तर्क) के किसी भी में मैं सिर्फ इस मूल्य के लिए एक सार्वजनिक संपत्ति को परिभाषित करने और जब भी जरूरत मैं इसे का उपयोग करें। क्या यह स्थिर फ़ील्ड OnActionExecuting() और वास्तव में नियंत्रक विधि को निष्पादित करने के बीच खो नहीं जाएगा? क्या सर्वर पर अनुरोध प्रसंस्करण के दौरान इस मूल्य को खोने के साथ कोई अन्य समस्याएं हैं?

क्या कोई अन्य/बेहतर विकल्प मैंने अभी तक नहीं माना है?

उत्तर

8

मैंने पाया कि ActionParameters का उपयोग कर अपने कोड बहुत आसानी से परीक्षण योग्य बनाता है। आप यह बहुत की तरह कर सकते हैं:

// inside your actionfilter 
public override void OnActionExecuting(ActionExecutinContext context) 
{ 
    var someData = // ... load some data 

    context.ActionParameters["someData"] = someData; 
} 


// and then in your action method 
[ProvideSomeData] 
public ViewResult Index(SomeData someData) 
{ 
    // someData will be populated in here 
} 
+0

वास्तव में काफी दिलचस्प है। क्या ऐसा है कि एक्शन कन्स्ट्रक्टर पैरामीटर स्वचालित रूप से एक्शन पैरामीटर संग्रह कुंजी पर मैप किए जाएंगे? – User

+0

हाँ कार्रवाई पैरामीटर नियंत्रक में मान पास करने के लिए पसंदीदा तरीका होना चाहिए। – kazimanzurrashid

+0

आखिरकार मुझे यह दृष्टिकोण पसंद आया, हालांकि यह निश्चित रूप से डीआरवाई सिद्धांत से इनकार करता है। पारितोषिक के लिए धन्यवाद। – User

3

पुन: # 2

बस का कहना है करने के लिए एक स्थिर क्षेत्र के साथ समस्या यह है कि एक से अधिक अनुरोध सभी एक ही स्थिर क्षेत्र का उपयोग किया जाएगा है कि चाहता था। यदि आपके पास समवर्ती रूप से निष्पादित करने के दो अनुरोध हैं तो हमेशा एक मौका है कि अनुरोध बी अनुरोध ए के मूल्य को ओवरराइट करेगा और अनुरोध के लिए कार्रवाई निष्पादित होने पर आप गलत मान का उपयोग करेंगे।

मैं अनुरोध विशिष्ट जानकारी रखने के लिए स्थिर सदस्यों का उपयोग करने से बचूंगा।

+0

धन्यवाद। मैं ऐसा कुछ डर गया था। इसलिए, इन स्थिर क्षेत्रों को सभी अनुरोधों के बीच साझा किया जाता है और प्रत्येक अनुरोध को अपना संदर्भ नहीं मिलता है? – User

+2

सही - सार्वजनिक स्थैतिक फ़ील्ड और गुण एप्लिकेशन में प्रत्येक थ्रेड के लिए दृश्यमान होते हैं। – OdeToCode