में नियंत्रकों के बाहर ViewResults बनाना मेरे नियंत्रक कार्यों में से कई विफलता-हैंडलिंग व्यवहार का एक मानक सेट है। सामान्य तौर पर, मैं चाहता हूँ करने के लिए:ASP.NET MVC
- लोड एक वस्तु मार्ग डेटा (आईडी और की तरह)
- के आधार पर मार्ग डेटा एक वैध वस्तु को इंगित नहीं करता है (उदा: के माध्यम से यूआरएल हैकिंग) तो समस्या के उपयोगकर्ता को सूचित और एक HTTP 404 नहीं मिला
- मान्य वर्तमान उपयोगकर्ता वस्तु
- पर उचित अनुमतियां हैं उपयोगकर्ता की अनुमति नहीं है, तो लौटने के लिए, (: यह एक दृश्य में प्रस्तुत करना यानी) समस्या के उपयोगकर्ता को सूचित और एक HTTP 403 निषिद्ध
- लौट यदि उपरोक्त सफल होता है, तो उस वस्तु है कि कार्रवाई के लिए विशेष के साथ कुछ करना।
ये चरण इतना मानकीकृत हैं कि मैं व्यवहार को लागू करने के लिए पुन: प्रयोज्य कोड चाहता हूं।
मेरे हमले की मौजूदा योजना कुछ इस तरह करने के लिए एक सहायक विधि के लिए किया गया था:
public static ActionResult HandleMyObject(this Controller controller,
Func<MyObject,ActionResult> onSuccess) {
var myObject = MyObject.LoadFrom(controller.RouteData).
if (myObject == null) return NotFound(controller);
if (myObject.IsNotAllowed(controller.User)) return NotAllowed(controller);
return onSuccess(myObject);
}
# NotAllowed() is pretty much the same as this
public static NotFound(Controller controller){
controller.HttpContext.Response.StatusCode = 404
# NotFound.aspx is a shared view.
ViewResult result = controller.View("NotFound");
return result;
}
समस्या है कि यहाँ Controller.View() एक संरक्षित तरीका है और इसलिए एक सहायक से सुलभ नहीं है । मैंने स्पष्ट रूप से एक नया ViewResult उदाहरण बनाने पर देखा है, लेकिन यह निर्धारित करने के लिए पर्याप्त गुण हैं कि मैं पहले नुकसान के बिना ऐसा करने के बारे में सावधान हूं।
किसी विशेष नियंत्रक के बाहर से ViewResult बनाने का सबसे अच्छा तरीका क्या है?
+1: इस तरह मैं इसे करूँगा। –
जो चीज़ मुझे इस बारे में पसंद नहीं है वह यह है कि इसका मतलब है कि नियंत्रक के पास केवल साझा क्रिया व्यवहार का एक सेट हो सकता है: जिसे वह (अकेला) विरासत में मिलता है। इस विशेष उदाहरण के लिए यह कोई मुद्दा नहीं है, लेकिन प्रोजेक्ट बढ़ने के साथ ही मैं इसे और अधिक बेकार महसूस कर सकता हूं। –
मुझे एहसास है कि आपका प्रश्न साल पुराना है, लेकिन मैंने सोचा कि मैं एक और संभावना का उल्लेख करूंगा। आप अपने बेस कंट्रोलर पर 'व्यू व्यू()' नामक 'व्यू()' के सार्वजनिक संस्करण का पर्दाफाश कर सकते हैं, फिर आप अपने सहायक को एक अलग वर्ग में रख सकते हैं। आपको अभी भी अपने नियंत्रक को अपने सहायक में पास करने की आवश्यकता होगी, जो थोड़ा अजीब है, लेकिन यह विरासत की बजाय संरचना की अनुमति देता है। – devuxer