2009-07-22 29 views
7

में जेनेरिक बेस कंट्रोलर एरर हैंडलिंग के साथ समस्या मेरे पास मेरे बेस कंट्रोलर में एक कैचल है जो मुझे पकड़ने वाली त्रुटियों को संभालती है। यह इस तरह मोटे तौर पर चला जाता है:एएसपी.नेट एमवीसी

protected override void OnException(ExceptionContext filterContext) 
{ 
    // Bail if we can't do anything 
    if (filterContext == null) 
     return; 

    // log 
    var ex = filterContext.Exception ?? 
      new Exception("No further information exists."); 
    LogException(ex); 

    filterContext.ExceptionHandled = true; 
    var data = new ErrorPresentation 
     { 
     ErrorMessage = HttpUtility.HtmlEncode(ex.Message), 
     TheException = ex 
     }; 
    filterContext.Result = View("Error", data); 
    base.OnException(filterContext); 
} 

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

मैंने रीडायरेक्ट टॉक्शन में दृश्य बदलने की कोशिश की है, लेकिन यह एक नियंत्रक के रूप में काम नहीं करेगा क्योंकि प्रत्येक नियंत्रक (होम/त्रुटि, कॉन्फ़िगरेशन/त्रुटि इत्यादि) के लिए कोई मार्ग मौजूद नहीं है।

मैं इसे नियंत्रक में दोनों त्रुटियों और पृष्ठ पर त्रुटियों के लिए कैसे काम कर सकता हूं?

+0

आप कह रहे हैं कि एक त्रुटि एक दृश्य में occures जब, अपने त्रुटि पृष्ठ मिलता है लाइन आपके विचार में त्रुटि हुई के बाद प्रदान की गई ? –

उत्तर

1

आपको यह पता लगाने के लिए एक तरीका चाहिए कि पृष्ठ किस स्थिति में है ताकि आप कार्रवाई को निष्पादित कर रहे हों या नहीं - इस मामले में आप परिणाम को प्रतिस्थापित करना चाहते हैं - या परिणाम निष्पादित करना - इस मामले में आप प्रतिक्रिया की सामग्री को त्यागना चाहते हैं और त्रुटि के लिए एक नया ViewResult निष्पादित करना चाहते हैं। बेस नियंत्रक में ध्वज रखना इसे संभालने का एक तरीका होगा। आप अपवाद प्रकार के आधार पर भी बताने में सक्षम हो सकते हैं। मुझे यकीन नहीं है कि यह कितना भरोसेमंद होगा।

एक बार जब आप राज्य आप कर सकते हैं यह पता लगाने:

var view = View("Error", data); 
if (executingResult) 
{ 
    filterContext.HttpContext.Response.ClearContent(); 
    view.ExecuteResult(); 
} 
else 
{ 
     filterContext.Result = view; 
     base.OnException(filterContext); 
} 

टिप्पणी: आम तौर पर मैं यह कर रहा वकालत नहीं करते। मुझे लगता है कि आपके नियंत्रक कार्रवाई को यह देखने की गारंटी देनी चाहिए कि जिस डेटा को इसकी आवश्यकता है वह वहां है या आपका दृश्य रक्षात्मक रूप से लिखा जाना चाहिए ताकि यह सुनिश्चित किया जा सके कि कोई अपवाद नहीं है (विशेष रूप से NullReferenceExceptions) नहीं होता है।

12

यह एक पुराना सवाल है, लेकिन किसी के लिए बेहद सख्त खोज करने के लिए, यह कोड मेरे लिए अपवादों के लिए कहीं भी काम करता है - कंट्रोलर, एक्शन या एक्शन नतीजे, यानी दृश्य या किसी भी मददकर्ता जो दृश्य कॉल करता है। (मैं इसे स्टीव सैंडरसन की किताब से मिला, कारण जहां से वह संबंधित को देने के लिए):

protected override void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.ExceptionHandled) 
      return; 

     //Let the request know what went wrong 
     filterContext.Controller.TempData["Exception"] = filterContext.Exception; 

     //redirect to error handler 
     filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(
      new { controller = "Exception", action = "HandleError" })); 

     // Stop any other exception handlers from running 
     filterContext.ExceptionHandled = true; 

     // CLear out anything already in the response 
     filterContext.HttpContext.Response.Clear(); 
    } 
+0

अच्छा, इसका एक टुकड़ा इस्तेमाल किया और यह बहुत अच्छा काम किया। – Andrew

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