我见过一个很好的例子,MVC控制器类继承自另一个处理异常的控制器类,并返回一个内部错误的视图,如下所示:
public class ApplicationController : Controller
{
public ActionResult NotFound()
{
return View("NotFound");
}
public ActionResult InsufficientPriveleges()
{
return View("InsufficientPriveleges");
}
protected override void OnException(ExceptionContext filterContext)
{
if (filterContext.Exception is NotFoundException)
{
filterContext.Result = NotFound();
filterContext.ExceptionHandled = true;
return;
}
if (filterContext.Exception is InsufficientPrivelegesException)
{
filterContext.Result = InsufficientPriveleges();
filterContext.ExceptionHandled = true;
return;
}
base.OnException(filterContext);
}
}
但是,我注意到,例如我的控制器正在部分视图中加载用户无法访问的内容,然后错误将显示在页面的局部视图中。
我希望整个页面显示错误,实际上异常应该重定向到一个全新的页面。如何使用上面显示的当前类来实现这一目标?
答案 0 :(得分:2)
您可以在web.config中创建从HTTP结果代码到特定错误处理程序的映射:
<customErrors mode="On" defaultRedirect="~/Error">
<error statusCode="401" redirect="~/Error/Unauthorized" />
<error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>
然后创建自定义错误控制器
public class ErrorController
{
public ActionResult Index ()
{
return View ("Error");
}
public ActionResult Unauthorized ()
{
return View ("Error401");
}
public ActionResult NotFound ()
{
return View ("Error404");
}
}
然后从控制器中抛出HttpException
public ActionResult Test ()
{
throw new HttpException ((int)HttpStatusCode.Unauthorized, "Unauthorized");
}
另一种方法是使用自定义FilterAttribute来检查抛出HttpException的权限
[Authorize (Roles = SiteRoles.Admin)]
public ActionResult Test ()
{
return View ();
}
答案 1 :(得分:0)
你必须以不同的方式处理ajax调用。我只是使用jquery $ .ajax的error()来处理那种ajax调用错误。
$.ajax({
...
success: function(g) {
//process normal
},
error: function(request, status, error) {
//process exception here
}
})