2010-01-12 10 views
5

में एक मॉडल को संशोधित करें मेरे पास एक एक्शनफिल्टर है कि मैं एएसपी.नेट एमवीसी 2 पर ऑनएक्शन एक्सेलिंग कर रहा हूं। अनिवार्य रूप से मैं एक्शनफिल्टर को अपने डेटा को स्वच्छ करने और मौजूदा मॉडल को प्रतिस्थापित करने के लिए चाहता हूं (जो बाद के एक्शन फ़िल्टर को पास किया जाएगा और स्वच्छता मॉडल के साथ भी मेरी क्रिया विधि)। क्या यह संभव है और क्या यह एक बुरा विचार है - यदि ऐसा है तो क्यों?एक एक्शनफ़िल्टर

अग्रिम धन्यवाद, जेपी

+0

बुरा डिजाइन खुशबू। –

+7

फिलिप, यदि आप आलोचना करने जा रहे हैं तो कृपया रचनात्मक बनें। मुझे बताएं कि यह खराब डिज़ाइन क्यों है, मुझे बताएं कि आप अच्छे विकल्पों के रूप में क्या देखते हैं ... अन्यथा आपकी टिप्पणी मेरे लिए बेकार है और कोई भी इस पोस्ट को पढ़ रहा है ... –

उत्तर

5

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

आम तौर पर एक्शनफ़िल्टर का उपयोग क्रॉस-कटिंग चिंताओं के लिए किया जाता है - कुछ ऐसा जो आप कई एक्शन विधियों के लिए चलाना चाहते हैं, भले ही वे ऐप में मौजूद हों। इसलिए जब तक कि आपका मॉडल स्वच्छता तर्क कई नियंत्रकों और कार्यों में लागू नहीं होता है, या बहुत सामान्य है (जो शायद यह है, जिस स्थिति में आपका दृष्टिकोण संभवतः अच्छा है), तो आप इसे फ़िल्टर से और अपने नियंत्रकों में से बाहर ले जाना चाहते हैं। यदि यह ऐसा कुछ है जो व्यापक रूप से लागू हो सकता है, तो एक एक्शनफ़िल्टर ठीक है।

+0

मैं निश्चित रूप से आपका बिंदु देखता हूं लेकिन स्वच्छता बहुत सीसीसी है और नियंत्रकों और कार्रवाई विधियों में इस्तेमाल किया जाएगा। –

6

यहाँ MVC v1 के लिए है, मुझे आशा है कि इस वी 2 में नहीं बदला गया है:

var view = filterContext.Result as ViewResultBase; 
if (view != null) 
    view.ViewData.Model ... 

मैं नहीं दिख रहा है तुम क्यों OnActionExecuting में करना चाहते हैं, लेकिन अगर आप चाहिए, यह वहाँ करते हैं, और कुछ ध्वज (निजी क्षेत्र) सेट करें कि OnActionExecuted को परिणामस्वरूप मॉडल को ट्विक करना होगा। लेकिन आपको बाद में इसका उपयोग करना होगा, सिवाय इसके कि यदि आप Result को असाइन करते हैं - इस मामले में आपकी कार्रवाई बिल्कुल नहीं बुलाई जाएगी और निर्दिष्ट परिणाम का उपयोग किया जाएगा।

+0

मैं मॉडल ऑनएक्शन एक्सक्लटिंग (यानी क्रिया निष्पादन से पहले) तक पहुंचने का प्रयास कर रहा हूं, इसलिए इस मामले में मॉडल हमेशा शून्य हो जाएगा .... –

+0

मुझे और अधिक स्पष्ट होना चाहिए - कारण मैं इसे करना चाहता हूं (ऑन) करना चाहिएएक्शनएक्समेंटिंग तो मैं अभी भी ValidateInput फ़िल्टर को आग लगा सकता हूं (और इसे बंद करने की ज़रूरत नहीं है !!!)। यदि मेरे गुणों में उस बिंदु पर HTML शामिल है तो उन्हें खतरनाक के रूप में चिह्नित किया जाएगा और फ़िल्टर विफल हो जाएगा (बेहतर अवधि की आवश्यकता के लिए)। इस दूसरे फ़िल्टर को मारने से पहले डेटा को अद्यतन करने की आवश्यकता है, इसलिए OnActionExecuted बहुत देर हो चुकी है ... –

2

Btw, MVC 3 & 4 के लिए:

filterContext.Controller.ViewData.Model 
संबंधित मुद्दे