【发布时间】:2018-02-10 13:40:03
【问题描述】:
在ASP.NET MVC 5 中,我正在尝试扩展我网站的一般错误处理功能,但无法一次性涵盖ActionResult 和JsonResult。我知道JsonResult 与ActionResult 不同,但是当我返回ActionResult 时,我只是给MVC 一个View,而对于JsonResult,我使用Javascript 处理结果。
那么情况,Action的返回值是一个ActionResult,而Application_Error()返回一个JsonResult,这个Json就会被打印在视图中。在那种情况下你应该怎么做?我宁愿让它重定向到错误页面或登录屏幕。我什至不知道我是否应该制作这样的 javascript 来处理 json 的捕获以手动重定向,或者我应该使用一些“内置”MVC 机制。
在一个简化的例子中,我有两个Action's:
public ActionResult ShowPackages(PackagesViewModel packagesViewModel)
{
var model = PackageBalhelper.GetPackageViewModel(packagesViewModel);
return View(model);
}
[HttpPost]
public JsonResult GetDatatableRows(PackagesViewModel packagesViewModel)
{
var jsonResult = CreateJsonResult(packagesViewModel);
return jsonResult;
}
到目前为止我所做的(来自MSDN)
protected void Application_Error()
{
HttpContext httpContext = HttpContext.Current;
if (httpContext != null)
{
var requestContext = ((MvcHandler)httpContext.CurrentHandler).RequestContext;
// When the request is ajax the system can automatically handle a mistake with a JSON response. Then overwrites the default response
if (requestContext.HttpContext.Request.IsAjaxRequest())
{
httpContext.Response.Clear();
string controllerName = requestContext.RouteData.GetRequiredString("controller");
IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
IController controller = factory.CreateController(requestContext, controllerName);
ControllerContext controllerContext = new ControllerContext(requestContext, (ControllerBase)controller);
var jsonResult = new JsonResult
{
Data = new
{
success = false,
serverError = "500"
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
jsonResult.ExecuteResult(controllerContext);
httpContext.Response.End();
}
else
{
LogHelper.WriteMessageToLog("In 'Application_Error'. Not an ajax request'.");
//httpContext.Response.Redirect("~/Error");
}
}
}
【问题讨论】:
-
您通过javascript调用的代码需要知道错误并适当地处理它。当出现错误时你所做的就是设计决策。您可以通过 javascript 重定向到错误视图/页面。
标签: asp.net-mvc error-handling asp.net-mvc-5