2008-09-21 11 views
9

एस्पनेट एमवीसी में हैंडलरर फ़िल्टर है जो एक त्रुटि उत्पन्न करता है यदि कोई त्रुटि होती है, लेकिन यदि कोई JsonResult एक्शन को कॉल करते समय कोई त्रुटि उत्पन्न होती है तो मैं एक JSON ऑब्जेक्ट को कैसे लौटा सकता हूं जो त्रुटि का प्रतिनिधित्व करता है?एक हैंडलर फ़िल्टर से जेएसओएन कैसे वापस करें?

मैं प्रत्येक एक्शन विधि में कोड को लपेटना नहीं चाहता हूं जो इसे पूरा करने के लिए कोशिश/पकड़ में एक जेसनआरसल्ट लौटाता है, मैं इसे 'हैंडलजेसन एरर' विशेषता जोड़कर या मौजूदा हैंडलरर विशेषता का उपयोग करके करना चाहता हूं आवश्यक कार्रवाई विधियों।

उत्तर

9

हैंडलरर एट्रिब्यूट के एमवीसी कार्यान्वयन पर नज़र डालें। यह एक ViewResult देता है। आप अपना खुद का संस्करण (हैंडलजेसन एरर एट्रिब्यूट) लिख सकते हैं जो एक जेसनआरसल्ट लौटाता है।

+0

मैंने यह कोशिश की है, लेकिन जब हैंडलजेसन एररएट्रिब्यूट ऑनएक्सप्शन विधि को फ़िल्टरकॉन्टेक्स्ट कहा जाता है। अपवाद हैडलड संपत्ति हमेशा सत्य होती है जब नियंत्रक वर्ग पर हैंडलरर एट्रिब्यूट होता है तो कार्रवाई संबंधित होती है। क्या कार्रवाई विधियों को आतंकवाद को प्राथमिकता नहीं लेनी चाहिए और पहले कहा जाना चाहिए? –

1

शायद आप अपनी खुद की विशेषता बना सकते हैं और एक कन्स्ट्रक्टर वैल्यू बना सकते हैं जो व्यू या जेसन का एनम वैल्यू लेता है। मेरा मतलब यह है कि मैं क्या कहता हूं इसका प्रदर्शन करने के लिए कस्टम प्राधिकरण विशेषता के लिए उपयोग कर रहा हूं। इस तरह जब एक जेसन अनुरोध पर प्रमाणीकरण विफल रहता है तो यह एक जेसन त्रुटि के साथ प्रतिक्रिया करता है और यदि यह एक दृश्य देता है।

public enum ActionResultTypes 
    { 
     View, 
     Json 
    } 

    public sealed class AuthorizationRequiredAttribute : ActionFilterAttribute, IAuthorizationFilter 
    { 
     public ActionResultTypes ActionResultType { get; set; } 

     public AuthorizationRequiredAttribute(ActionResultTypes actionResultType) 
     { 
      this.ActionResultType = ActionResultType; 
     } 
    } 

    //And used like 
    [AuthorizationRequired(ActionResultTypes.View)] 
    public ActionResult About() 
    { 
    } 
+0

मैं एक कामकाजी उदाहरण को आजमाने और कार्यान्वित करने जा रहा हूं। यदि आपको पता चलता है कि यह काम नहीं करता है या कोई अलग समाधान ढूंढता है तो कृपया मुझे बताएं! – Vyrotek

7

संक्षेप में, जाने का रास्ता HandleErrorAttribute विस्तार करने के लिए, इस तरह हो सकता है:

public class OncHandleErrorAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext context) 
    { 
     // Elmah-Log only handled exceptions 
     if (context.ExceptionHandled) 
      ErrorSignal.FromCurrentContext().Raise(context.Exception); 

     if (context.HttpContext.Request.IsAjaxRequest()) 
     { 
      // if request was an Ajax request, respond with json with Error field 
      var jsonResult = new ErrorController { ControllerContext = context }.GetJsonError(context.Exception); 
      jsonResult.ExecuteResult(context); 
      context.ExceptionHandled = true; 
     } 
     else 
     { 
      // if not an ajax request, continue with logic implemented by MVC -> html error page 
      base.OnException(context); 
     } 
    } 
} 

निकालें Elmah प्रवेश कोड लाइन यदि आप इसे ज़रूरत नहीं है। मैं एक त्रुटि और संदर्भ के आधार पर एक जेसन वापस करने के लिए अपने नियंत्रकों में से एक का उपयोग करता हूं। यहां नमूना है:

public class ErrorController : Controller 
{ 
    public ActionResult GetJsonError(Exception ex) 
    { 
     var ticketId = Guid.NewGuid(); // Lets issue a ticket to show the user and have in the log 

     Request.ServerVariables["TTicketID"] = ticketId.ToString(); // Elmah will show this in a nice table 

     ErrorSignal.FromCurrentContext().Raise(ex); //ELMAH Signaling 

     ex.Data.Add("TTicketID", ticketId.ToString()); // Trying to see where this one gets in Elmah 

     return Json(new { Error = String.Format("Support ticket: {0}\r\n Error: {1}", ticketId, ex.ToString()) }, JsonRequestBehavior.AllowGet); 
    } 

मैं ऊपर कुछ टिकट जानकारी जोड़ता हूं, आप इसे अनदेखा कर सकते हैं। तरीके के कारण फिल्टर लागू किया गया है (डिफ़ॉल्ट HandleErrorAttributes फैली) करने के लिए हम वैश्विक फिल्टर से तो HandleErrorAttribute निकाल सकते हैं:

public class MvcApplication : System.Web.HttpApplication 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new GlobalAuthorise()); 
     filters.Add(new OncHandleErrorAttribute()); 
     //filters.Add(new HandleErrorAttribute()); 
    } 

यह मूलतः यह है। अधिक विस्तृत जानकारी के लिए आप my blog entry पढ़ सकते हैं, लेकिन विचार के लिए, ऊपर पर्याप्त होना चाहिए।

+2

उपरोक्त कार्यों IISExpress में विकसित करते समय। वास्तविक आईआईएस वेबसर्वर पर तैनात किए जाने के लिए इसे काम करने के लिए हमें 'संदर्भ' जोड़ने की आवश्यकता है। एचटीपी कॉन्टेक्स्ट। रेस्पॉन्स। ट्रीस्कीपआईइस कस्टमइरर्स = सच; 'जब आईआईएस अन्य वाइज के रूप में हमारे जेसन मैसेज को बनाते हैं तो त्रुटि संदेश ओवरराइड करता है और इसका डिफ़ॉल्ट स्थिति कोड 500 पेज प्रदर्शित करता है – mortb

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