7

में पार्टिकल व्यू विधियों का आह्वान किया है यदि एक सामान्य पृष्ठ लोड त्रुटियों में मैं Error दृश्य और HandleErrorInfo मॉडल के माध्यम से उपयोगकर्ता को अपवाद विवरण की रिपोर्ट कर सकता हूं।अजाक्स से रिपोर्टिंग त्रुटियों ने एमवीसी

एक ajax कॉल एक Json परिणाम त्रुटियों की उम्मीद है, मैं स्पष्ट रूप से त्रुटि संभालने के लिए और ग्राहक के लिए विवरण पारित कर सकते हैं, तो:

public JsonResult Whatever() 
{ 
    try 
    { 
     DoSomething(); 
     return Json(new { status = "OK" }); 
    } 
    catch (Exception e) 
    { 
     return Json(new { status = "Error", message = e.Message }); 
    } 
} 

तो, मेरी समस्या है, मैं नहीं त्रुटि विवरण भेजने के लिए किसी भी तरह से देख सकते हैं एक अजाक्स कॉल से आंशिक दृश्य लौटने वाली कार्रवाई के लिए।

$.ajax({ 
    url: 'whatever/trevor', 
    error: function (jqXHR, status, error) { 
     alert('An error occured: ' + error); 
    }, 
    success: function (html) { 
     $container.html(html); 
    } 
}); 

यह केवल एक एचटीपी त्रुटि कोड (जैसे आंतरिक सर्वर त्रुटि) की रिपोर्ट करेगा जो क्लाइंट के लिए सहायक नहीं है। क्या कोई सफल पार्टियल व्यू (एचटीएमएल) परिणाम या त्रुटि संदेश पास करने के लिए कुछ चालाक चाल है?

ViewResult से एचटीएमएल का स्पष्ट रूप से मूल्यांकन करना और Json ऑब्जेक्ट के हिस्से के रूप में इसे एक स्थिति के साथ वापस लौटाना बहुत सुगंधित लगता है। क्या इस परिदृश्य को संभालने के लिए एक स्थापित पैटर्न है?

उत्तर

14

नियंत्रक कार्रवाई:

public ActionResult Foo() 
{ 
    // Obviously DoSomething could throw but if we start 
    // trying and catching on every single thing that could throw 
    // our controller actions will resemble some horrible plumbing code more 
    // than what they normally should resemble: a.k.a being slim and focus on 
    // what really matters which is fetch a model and pass to the view 

    // Here you could return any type of view you like: JSON, HTML, XML, CSV, PDF, ... 

    var model = DoSomething(); 
    return PartialView(model); 
} 

तब हम अपने आवेदन के लिए एक वैश्विक त्रुटि हैंडलर को परिभाषित:

protected void Application_Error(object sender, EventArgs e) 
{ 
    var exception = Server.GetLastError(); 
    var httpException = exception as HttpException; 
    Response.Clear(); 
    Server.ClearError(); 

    if (new HttpRequestWrapper(Request).IsAjaxRequest()) 
    { 
     // Some error occurred during the execution of the request and 
     // the client made an AJAX request so let's return the error 
     // message as a JSON object but we could really return any JSON structure 
     // we would like here 

     Response.StatusCode = 500; 
     Response.ContentType = "application/json"; 
     Response.Write(new JavaScriptSerializer().Serialize(new 
     { 
      errorMessage = exception.Message 
     })); 
     return; 
    } 

    // Here we do standard error handling as shown in this answer: 
    // http://stackoverflow.com/q/5229581/29407 

    var routeData = new RouteData(); 
    routeData.Values["controller"] = "Errors"; 
    routeData.Values["action"] = "General"; 
    routeData.Values["exception"] = exception; 
    Response.StatusCode = 500; 
    if (httpException != null) 
    { 
     Response.StatusCode = httpException.GetHttpCode(); 
     switch (Response.StatusCode) 
     { 
      case 404: 
       routeData.Values["action"] = "Http404"; 
       break; 
      case 500: 
       routeData.Values["action"] = "Http500"; 
       break; 
     } 
    } 

    IController errorsController = new ErrorsController(); 
    var rc = new RequestContext(new HttpContextWrapper(Context), routeData); 
    errorsController.Execute(rc); 
} 

यहाँ वैश्विक त्रुटि हैंडलर में इस्तेमाल ErrorsController दिखाई दे सकता है बताया गया है। शायद हम 404 और 500 कार्यों के लिए कुछ कस्टम दृश्य निर्धारित कर सकते हैं:

public class ErrorsController : Controller 
{ 
    public ActionResult Http404() 
    { 
     return Content("Oops 404"); 
    } 

    public ActionResult Http500() 
    { 
     return Content("500, something very bad happened"); 
    } 
} 

फिर हम इतना है कि हम सब AJAX अनुरोध के लिए इस त्रुटि से निपटने के कोड को दोहराने की जरूरत नहीं है सब AJAX त्रुटियों के लिए एक global error handler के लिए सदस्यता ले सकता है, लेकिन अगर हम चाहते थे कि हम इसे दोहरा सकते:

$('body').ajaxError(function (evt, jqXHR) { 
    var error = $.parseJSON(jqXHR.responseText); 
    alert('An error occured: ' + error.errorMessage); 
}); 

और अंत में हम नियंत्रक कार्रवाई है कि हमें आशा है कि इस मामले में एक HTML आंशिक वापस आ जाएगी करने के लिए एक AJAX अनुरोध आग:

$.ajax({ 
    url: 'whatever/trevor', 
    success: function (html) { 
     $container.html(html); 
    } 
}); 
+1

डैरिन में AjaxAuthorizeAttribute पर एक नज़र MVC के अपने ज्ञान मुझे फिर से astounds है। मैंने यहां कुछ बिंदुओं को पूरी तरह से समझ नहीं लिया, लेकिन मुझे पता चला कि मैं वैश्विक फिल्टर में पंजीकृत AJAX फ़िल्टर के साथ कुछ और अधिक हासिल कर सकता हूं। ऐसा लगता है कि ठीक काम कर रहा है। धन्यवाद। – fearofawhackplanet

+0

बस एक नोट, यदि आप 404 के जाल में फंसाने के लिए उपर्युक्त कोड का उपयोग कर रहे हैं और एक कस्टम पेज दिखाते हैं तो आप शायद एक प्रतिक्रिया जोड़ना चाहते हैं। ट्रीस्कीपआईइस कस्टमइरर्स = सच (.नेट 3.5 केवल मुझे विश्वास है) –

+0

एक आकर्षण, अजीब तरह काम करता है – Dilip

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