来自Ajax的报告错误调用了MVC中的PartialView方法

前端之家收集整理的这篇文章主要介绍了来自Ajax的报告错误调用了MVC中的PartialView方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果是正常的页面加载错误,我可以通过Error视图和HandleErrorInfo模型向用户报告异常详细信息.

如果ajax调用期望Json结果错误,我可以显式处理错误并将详细信息传递给客户端:

  1. public JsonResult Whatever()
  2. {
  3. try
  4. {
  5. DoSomething();
  6. return Json(new { status = "OK" });
  7. }
  8. catch (Exception e)
  9. {
  10. return Json(new { status = "Error",message = e.Message });
  11. }
  12. }

所以,我的问题,我看不出有任何方法可以将Ajax调用中的错误详细信息报告给返回局部视图的操作.

  1. $.ajax({
  2. url: 'whatever/trevor',error: function (jqXHR,status,error) {
  3. alert('An error occured: ' + error);
  4. },success: function (html) {
  5. $container.html(html);
  6. }
  7. });

这只会报告对客户端没有帮助的Http错误代码(例如内部服务器错误).是否有一些聪明的技巧来传递成功的PartialView(html)结果或错误消息?

从ViewResult中明确地评估html并将其作为Json对象的一部分返回以及状态似乎太臭了.是否存在处理此方案的既定模式?

控制器动作:
  1. public ActionResult Foo()
  2. {
  3. // ObvIoUsly DoSomething could throw but if we start
  4. // trying and catching on every single thing that could throw
  5. // our controller actions will resemble some horrible plumbing code more
  6. // than what they normally should resemble: a.k.a being slim and focus on
  7. // what really matters which is fetch a model and pass to the view
  8.  
  9. // Here you could return any type of view you like: JSON,HTML,XML,CSV,PDF,...
  10.  
  11. var model = DoSomething();
  12. return PartialView(model);
  13. }

然后我们为应用程序定义一个全局错误处理程序:

  1. protected void Application_Error(object sender,EventArgs e)
  2. {
  3. var exception = Server.GetLastError();
  4. var httpException = exception as HttpException;
  5. Response.Clear();
  6. Server.ClearError();
  7.  
  8. if (new HttpRequestWrapper(Request).IsAjaxRequest())
  9. {
  10. // Some error occurred during the execution of the request and
  11. // the client made an AJAX request so let's return the error
  12. // message as a JSON object but we could really return any JSON structure
  13. // we would like here
  14.  
  15. Response.StatusCode = 500;
  16. Response.ContentType = "application/json";
  17. Response.Write(new JavaScriptSerializer().Serialize(new
  18. {
  19. errorMessage = exception.Message
  20. }));
  21. return;
  22. }
  23.  
  24. // Here we do standard error handling as shown in this answer:
  25. // https://stackoverflow.com/q/5229581/29407
  26.  
  27. var routeData = new RouteData();
  28. routeData.Values["controller"] = "Errors";
  29. routeData.Values["action"] = "General";
  30. routeData.Values["exception"] = exception;
  31. Response.StatusCode = 500;
  32. if (httpException != null)
  33. {
  34. Response.StatusCode = httpException.GetHttpCode();
  35. switch (Response.StatusCode)
  36. {
  37. case 404:
  38. routeData.Values["action"] = "Http404";
  39. break;
  40. case 500:
  41. routeData.Values["action"] = "Http500";
  42. break;
  43. }
  44. }
  45.  
  46. IController errorsController = new ErrorsController();
  47. var rc = new RequestContext(new HttpContextWrapper(Context),routeData);
  48. errorsController.Execute(rc);
  49. }

以下是全局错误处理程序中使用的ErrorsController的外观.可能我们可以为404和500操作定义一些自定义视图:

  1. public class ErrorsController : Controller
  2. {
  3. public ActionResult Http404()
  4. {
  5. return Content("Oops 404");
  6. }
  7.  
  8. public ActionResult Http500()
  9. {
  10. return Content("500,something very bad happened");
  11. }
  12. }

然后我们可以为所有AJAX错误订阅global error handler,这样我们就不必为所有AJAX请求重复此错误处理代码,但如果我们想要,我们可以重复它:

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

最后,我们向控制器操作发出一个AJAX请求,我们希望在这种情况下返回HTML部分:

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

猜你在找的Ajax相关文章