2009-10-22 17 views
17

जावास्क्रिप्ट से एक्सएचआर कॉल से निपटने के दौरान मौजूदा [हैंडलरर] और [अधिकृत] विशेषताओं का लाभ उठाने का एक शानदार तरीका क्या है?asp.net mvc [handleerror] [अधिकृत] JsonResult के साथ?

तो, उदाहरण के लिए एक विधि GetJson कहें जो JsonResult लौटाता है।

जब कोई त्रुटि होती है, तो [हैंडलरर] विधि एक ViewResult वापस भेज देगी जिसे जावास्क्रिप्ट में कॉलबैक फ़ंक्शन में पुनर्प्राप्त किया जाएगा।

मैं तो संभालने के लिए और किसी भी दुर्घटनाओं रीडायरेक्ट करने के लिए, जावास्क्रिप्ट में हर जगह कस्टम कोड जगह होगा आदि

मैं क्या करना चाहते हैं क्या, [HandleError] विशेषता एक JsonResult लौट मूल अगर है कार्रवाई करने की योजना बना रहा था। यह मेरे हिस्से पर इच्छापूर्ण सोच हो सकता है।

इसी तरह, अगर एक अनधिकृत जेसन अनुरोध आता है, तो एक नया HttpUnuthorizedResult लौटने की बजाय मैं एक जेसनआरसल्ट वापस करना चाहता हूं जो मेरे क्लाइंट साइड कोड को सामान्य तरीके से चीजों को संभालने की अनुमति देता है।

क्या मैं यहां गलत पेड़ को भड़क रहा हूं? हो सकता है कि यहां तक ​​कि एक अच्छा तरीका भी है कि एमवीसी इसे संभाल सकता है जिसे मैं अनजान हूं?

अन्य परिदृश्य इस परिदृश्य को कैसे संभालने वाले हैं?

धन्यवाद।

पीएस: मुझे एहसास है कि मैं अपना खुद का [हैंडलजेसन एरर] और [AuthorizeJson] विशेषताएं बना सकता हूं जो ViewResults के बजाय जेसन रीसेट्स लौटाते हैं, लेकिन फिर मुझे आसपास जाना होगा और जेसन को लौटने वाली किसी भी विधि पर इन्हें रखना होगा, और चिंता करें फ़िल्टर ऑर्डर इत्यादि। यह निश्चित होगा कि अगर मैं मूल विधि के हस्ताक्षर के आधार पर वही विशेषता अधिनियम अलग-अलग करने के लिए प्रतिबिंब या कुछ का उपयोग कर सकता हूं तो यह अच्छा होगा।

उत्तर

27

आप नहीं करते हैं। अभी, वे JSON के साथ मदद नहीं करते हैं। हालांकि:

मुझे पता है मैं बना सकते हैं अपने खुद के [HandleJsonError] और [AuthorizeJson] गुण जो ViewResults के बजाय JsonResults लौटने के लिए, लेकिन फिर मैं चारों ओर जाओ और किसी भी विधि का Json रिटर्न पर इन जगह करना होगा, और फ़िल्टर आदेश के बारे में चिंता आदि

हम उप प्रकार मौजूदा विशेषताओं के लिए है, और उन्हें सशर्त काम करने के क्या किया:

public sealed class AjaxAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 
     if (filterContext.Result == null) 
     { 
      return; 
     } 
     else if (filterContext.Result.GetType() == typeof(HttpUnauthorizedResult) 
      && filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      filterContext.Result = new ContentResult(); 
      filterContext.HttpContext.Response.StatusCode = 403; 
     } 
    } 
} 

अब जे एस कोड के लिए देख सकते हैं आर 403 (क्योंकि एएसपी.नेट 401 खाता है और त्रुटि पृष्ठ देता है) और वही विशेषता अजाक्स और गैर-अजाक्स के लिए काम करता है। तो कोई फ़िल्टर ऑर्डर समस्या नहीं है।

+0

धन्यवाद! Request.IsAjaxRequest() बहुत उपयोगी है। मुझे नहीं पता था कि अस्तित्व में है। – Scott

+0

यह एक विस्तार विधि है जो एमवीसी जोड़ता है। यह वास्तव में अनुरोध का हिस्सा नहीं है। –

+1

धन्यवाद! यह एक बहुत ही सुरुचिपूर्ण तरीका है और इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए। हालांकि कन्स्ट्रक्टर की आवश्यकता नहीं है। –