2010-02-12 10 views
6

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

यहाँ फ़िल्टर कर

public class CustomExceptionFilter : FilterAttribute, IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.Exception.GetType() == typeof(CustomSecurityException)) 
     { 
      filterContext.ExceptionHandled = true; 
      RequestContext rc = new RequestContext(filterContext.HttpContext, filterContext.RouteData); 
      string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(new { Controller = "NoAccess", action = "Index", message = filterContext.Exception.Message })).VirtualPath; 
      filterContext.HttpContext.Response.Redirect(url, true); 
     } 
    } 
} 

उत्तर

2

कस्टम अपवाद के लिए कोड यह कुछ आप ब्राउज़र पर संभाल करने की जरूरत है। उदाहरण के लिए error() on jQuery.ajax() call को संभालने का प्रयास करें (और स्पष्ट रूप से रीडायरेक्ट वापस न करें ..)।

+0

यह सही जवाब है क्योंकि जब कोई AJAX त्रुटि होती है तो न तो कस्टम अपवाद या नियंत्रक कोड मारा जाता है। – stuartdotnet

0

आप यह सत्यापित कर सकते हैं कि अनुरोध AJAX अनुरोध है या नहीं। आप कर सकते थे, उदाहरण के लिए निम्नलिखित है ...

if (!filterContext.HttpContext.Request.IsAjaxRequest()){ 
    //Return a ViewResult 
    //filterContext.ExceptionHandled = true; 
    //filterContext.Result = new ViewResult { ViewName = "Error" ... }; 
} 
else{ 
    //An ajax request. 
    //return a partial view 
} 

लेकिन, जैसा कि मैक्सवेल ने कहा कि आप अपवाद बबल सामने दे सकता है अगर यह एक ajax अनुरोध है और ग्राहक पर त्रुटि संभाल। आप वैश्विक रूप से AJAX अनुरोधों में अपवादों को संभालने का एक तरीका सेट कर सकते हैं जैसे कि here

1

मैं सुझाव देता हूं कि अपवाद बबल को क्लाइंट तक पहुंचाए और मैक्सवेल सुझाए गए जैसे इसे संभालें।

हमारी पिछली परियोजना में हमने AJAX त्रुटियों को संभालने के लिए एक विशिष्ट एक्शनफ़िल्टर का उपयोग किया (Suteki Shop से उधार लिया गया)। ध्यान दें कि प्रतिक्रिया स्थिति 500 ​​(आंतरिक सर्वर त्रुटि) है। एक JQuery.ajax() कॉल के भीतर प्रतिनिधि त्रुटि() प्रतिनिधि को कॉल करने के लिए प्रतिक्रिया के लिए त्रुटि स्थिति की आवश्यकता होती है।

public class HandleErrorWithAjaxAttribute : HandleErrorAttribute 
    { 
     public HandleErrorWithAjaxAttribute() 
     { 
      ShowStackTraceIfNotDebug = true; 
     } 

     public bool ShowStackTraceIfNotDebug { get; set; } 

     public override void OnException(ExceptionContext filterContext) 
     { 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       string content = ShowStackTraceIfNotDebug || 
           filterContext.HttpContext.IsDebuggingEnabled 
            ? 
             filterContext.Exception.StackTrace 
            : 
             string.Empty; 
       filterContext.Result = new ContentResult 
              { 
               ContentType = MediaTypeNames.Text.Plain, 
               Content = content 
              }; 
       filterContext.HttpContext.Response.Status = 
        "500 " + filterContext.Exception.Message 
           .Replace("\r", " ") 
           .Replace("\n", " "); 
       filterContext.ExceptionHandled = true; 
       filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
      } 
      else 
      { 
       base.OnException(filterContext); 
      } 
     } 
    } 
0

क्या आपने प्रतिक्रिया को साफ़ करने का प्रयास किया था? नियंत्रक अभी भी प्रतिक्रिया सामग्री सेट कर सकता है।

filterContext.HttpContext.Response.Clear() 
filterContext.Result = new JsonResult { Data = new { Message = message } }; 
filterContext.HttpContext.Response.StatusCode = 500; 
filterContext.ExceptionHandled = true; 
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
1

मैं फॉर्म टैग में ऑनफेलर हैनल्डर का उपयोग करता हूं।

<form id="AJAXForm" method="post" action="" 
    onsubmit="Sys.Mvc.AsyncForm.handleSubmit(this, new Sys.UI.DomEvent(event), 
    { insertionMode: Sys.Mvc.InsertionMode.replace, httpMethod: 'POST', 
    updateTargetId: 'myPartialPage', onSuccess: Function.createDelegate(this, ajaxFormSucced), 
    onFailure: Function.createDelegate(this, ajaxFormFailure) });" > 

... समारोह ajaxFormSucced() { // कोड सफलता के लिए} समारोह ajaxFormFailure() { विफलता के लिए // कोड}

0

यह लिंक मुझे मदद की Handling ASP.NET MVC exceptions when posting to the controller via Ajax using jQuery

आखिरकार, जावास्क्रिप्ट Functio का परीक्षण करते समय n, पहली पंक्ति पर अलर्ट के साथ शुरू करें। आपके फ़ंक्शन में कोई जावास्क्रिप्ट त्रुटियां ब्राउज़र के माध्यम से जावास्क्रिप्ट त्रुटि प्रतिक्रिया के बिना मध्य निष्पादन में फ़ंक्शन को रोकने की संभावना है (आपके सेटअप के आधार पर)।

0

This आपकी मदद करेगा।

बस जोड़ें।IsAjaxRequest विस्तार विधि और ब्राउज़र के लिए 403 स्थिति कोड वापस, jQuery ajaxError यह प्रवेश पृष्ठ पर

0

पुनः निर्देशित मैक्सवेल कहते हैं संभाल लेंगे, क्लाइंट पर संभाल, इस

function handleError(ajaxContext) { 
    // Load parent 
} 

@using (Ajax.BeginForm("Index", "Home", new AjaxOptions 
{   
    UpdateTargetId = "MyDiv", 
    OnFailure = "handleError" 
})) 

की तरह कुछ का उपयोग कर आप यह है क्या करना चाहिए सुनिश्चित करें कि NoAccess के लिए नियंत्रक ActionResult कोड में निम्न कोड शामिल है, ताकि आपकी AJAX त्रुटि ट्रिगर हो।

HttpContext.Response.StatusCode = 401; 
संबंधित मुद्दे