其实你不能使用的web.config为403个重定向创建控制器。
你可以做的是覆盖OnActionExecuted
一个控制器上,以检查状态代码和重定向到无论是在web.config中定义,这样
Web.config文件:
<customErrors mode="On">
<error statusCode="403" redirect="~/Error/Forbidden" />
</customErrors>
你的HomeController
public class HomeController : Controller
{
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.HttpContext.Response.StatusCode == 403)
{
var config = (CustomErrorsSection)
WebConfigurationManager.GetSection("system.web/customErrors");
string urlToRedirectTo = config.Errors["403"].Redirect;
filterContext.Result = Redirect(urlToRedirectTo);
}
base.OnActionExecuted(filterContext);
}
public ActionResult Edit(int idObject)
{
if(!user.OnwsObject(idObject))
{
Response.StatusCode = 403;
}
return View();
}
}
ErrorController:
public class ErrorController : Controller
{
public ActionResult Forbidden()
{
Response.StatusCode = 403;
return View();
}
}
更通用的解决方案是创建可以应用到控制器或个人动作一个动作过滤器:
public class HandleForbiddenRedirect : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.HttpContext.Response.StatusCode == 403)
{
var config = (CustomErrorsSection)
WebConfigurationManager.GetSection("system.web/customErrors");
string urlToRedirectTo = config.Errors["403"].Redirect;
filterContext.Result = new RedirectResult(urlToRedirectTo);
}
base.OnActionExecuted(filterContext);
}
}
现在你可以将操作筛选到控制器,使所有的行动上403重定向
[HandleForbiddenRedirect]
public class HomeController : Controller
{
//...
}
,或是有个人行为重定向403
public class HomeController : Controller
{
[HandleForbiddenRedirect]
public ActionResult Edit(int idObject)
{
//...
}
}
或者,如果你不惯于装饰所有的控制器和行动,但想处处应用它,你可以在过滤器的Application_Start集合中添加它的Global.asax
的
GlobalFilters.Filters.Add(new HandleForbiddenRedirect());
没有尝试添加Response.StatusCode = 403 ; ?然后返回Json作为错误描述的结果? – taffarel
保持显示IIS默认页面而不是自定义:( –