C#-返回自定义错误
作者:互联网
我已经使用诸如Forbidden或NotFound之类的方法设计了一个名为ErrorController的Controller,因此可以将以下行添加到Web.config中:
<customErrors mode="On" defaultRedirect="~/Error/Unknown" />
<error statusCode="404" redirect="~/Error/NotFound" />
<error statusCode="403" redirect="~/Error/Forbidden" />
</customErrors>
所以现在我希望能够做这样的事情:
public ActionResult Edit(int idObject)
{
if( user.OnwsObject(idObject) )
{
// lets edit
}
else
{
// ** SEND AN ERROR 403 ***
// And let ASP.NET MVC with IIS manage that error to send
// the requester to the Web.config defined error page.
}
}
问题是我尝试了以下操作:(A)抛出新的HttpException(403,“错误描述”);:导致导致系统崩溃的Unhanded异常,(B)返回HttpStatusResultCode(403,“错误描述” ):导致出现这些错误的系统默认页面.
我应该怎么用呢?
提前致谢.
解决方法:
实际上,您不能将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)
{
//...
}
}
或者,如果您不想装饰所有的控制器和操作,但希望将其应用于所有地方,则可以将其添加到Global.asax的Application_Start中的过滤器集合中
GlobalFilters.Filters.Add(new HandleForbiddenRedirect());
标签:asp-net-mvc-4,iis-7,c,asp-net-mvc 来源: https://codeday.me/bug/20191030/1969234.html