2010-04-03 14 views
7

सभी,अपवाद ASP.NET MVC और Ajax में हैंडलिंग - [HandleException]

मैं MVC सीख रहा हूँ और एक व्यापार एप्लिकेशन (MVC 1.0) के लिए उपयोग करने से फिल्टर।

मैं वास्तव में अपवाद हैंडलिंग के आसपास अपने सिर को पाने के लिए संघर्ष कर रहा हूं। मैंने वेब पर बहुत समय बिताया है लेकिन मेरे बाद की चीज़ों के साथ कुछ भी नहीं मिला है।

हम वर्तमान में एक फ़िल्टर विशेषता का उपयोग करते हैं जो IExceptionFilter लागू करता है। हम इसके साथ एक बेस कंट्रोलर क्लास को सजाने के लिए सभी सर्वर साइड अपवादों को अच्छी तरह से एक अपवाद पृष्ठ पर भेज दिया जाता है जो त्रुटि प्रदर्शित करता है और लॉगिंग करता है।

मैंने AJAX कॉल का उपयोग करना शुरू कर दिया है जो JSON डेटा लौटाता है लेकिन जब सर्वर साइड कार्यान्वयन एक त्रुटि फेंकता है, तो फ़िल्टर निकाल दिया जाता है लेकिन पृष्ठ त्रुटि पृष्ठ पर रीडायरेक्ट नहीं होता है - यह केवल उस पृष्ठ पर रहता है जिसे पृष्ठ कहा जाता है AJAX विधि।

वहाँ सर्वर पर रीडायरेक्ट मजबूर करने के लिए कोई तरीका है (उदाहरण के लिए एक ASP.NET Server.Transfer या अनुप्रेषित?)

मैं पढ़ा है कि मैं एक JSON ऑब्जेक्ट (.NET लपेटकर लौटना चाहिए अपवाद) और फिर क्लाइंट पर रीडायरेक्ट करें, लेकिन फिर मैं गारंटी नहीं दे सकता कि क्लाइंट रीडायरेक्ट करेगा ... लेकिन फिर (हालांकि मैं कुछ गलत कर रहा हूं) सर्वर रीडायरेक्ट करने का प्रयास करता है लेकिन फिर अनधिकृत अपवाद (आधार नियंत्रक) सुरक्षित है लेकिन अपवाद नियंत्रक ऐसा नहीं है क्योंकि यह इस से प्राप्त नहीं होता है)

क्या किसी को कृपया एक साधारण उदाहरण (.NET और jQuery कोड) मिला है। मैं यह काम करेगा जैसे मैं बेतरतीब ढंग से आशा में बातें कोशिश कर रहा हूँ

अपवाद फ़िल्टर अब तक ...

public class HandleExceptionAttribute : FilterAttribute, IExceptionFilter 
{ 
    #region IExceptionFilter Members 

    public void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.ExceptionHandled) 
     { 
      return; 
     } 

     filterContext.Controller.TempData[CommonLookup.ExceptionObject] = filterContext.Exception; 

     if (filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      filterContext.Result = AjaxException(filterContext.Exception.Message, filterContext); 
     } 
     else 
     { 
      //Redirect to global handler 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = AvailableControllers.Exception, action = AvailableActions.HandleException })); 
      filterContext.ExceptionHandled = true; 
      filterContext.HttpContext.Response.Clear(); 
     } 
    } 

    #endregion 

    private JsonResult AjaxException(string message, ExceptionContext filterContext) 
    { 
     if (string.IsNullOrEmpty(message)) 
     { 
      message = "Server error"; //TODO: Replace with better message 
     } 

     filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; 
     filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;  //Needed for IIS7.0 

     return new JsonResult 
     { 
      Data = new { ErrorMessage = message }, 
      ContentEncoding = Encoding.UTF8, 
     }; 
    } 
} 
+1

+1 ग्राहम TrySkipIisCustomErrors को मुझे पेश करने के लिए। मुझे एक बेकार खोज के दौरान आपका प्रश्न मिला और मुझे खुशी है कि मैंने किया। –

+0

+1 बहुत, TrySkipIisCustomErrors पर हेड-अप के लिए धन्यवाद, जिसने वास्तव में भी मेरी मदद की। – Schmuli

उत्तर

2

मैं Ajax.Beginform में OnFailure hanlder का उपयोग() लग रहा है। क्लाइंट-साइड विफलता हैंडलर window.location (कई अन्य विकल्पों के बीच) सेटिंग द्वारा रीडायरेक्ट कर सकता है। यह 99% आधुनिक ब्राउज़र में काम करेगा- यदि ब्राउज़र AJAX का समर्थन करता है तो इसे इसका समर्थन करना चाहिए।

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