当我在应用程序中发生任何异常时,我试图重定向到asp.net mvc5的global.asax文件中的错误页面。执行Response.Redirect行后没有任何事情发生。
它根本没有重定向到路径中可用的errorpage~ \ View \ Shared \ Error.cshtml
protected void Application_Error(object sender, EventArgs e)
{
Server.ClearError();
Response.Clear();
HttpContext.Current.Response.Redirect("~\View\Shared\Error.cshtml");
//return;
}
并在webconfig中
<system.web>
<customErrors mode="On" defaultRedirect="~\View\Shared\Error.cshtml" />
</system.web>
我不确定出了什么问题。
我的错误控制器:
public class ErrorController : Controller
{
// GET: Error
public ActionResult Error()
{
return View("Error");
}
}
答案 0 :(得分:3)
我不建议使用Global.asax,除非你有一些自定义逻辑。我建议使用web.config。请注意,由于MVC使用路由而不是物理文件,因此您应该在web.config中使用类似的东西:
<httpErrors errorMode="Custom">
<remove statusCode="404"/>
<error statusCode="404" path="/error/404" responseMode="ExecuteUrl"/>
<httpErrors>
但是如果你想调用一些物理文件(例如html),你应该以这种方式使用它:
<httpErrors errorMode="Custom">
<remove statusCode="404"/>
<error statusCode="404" path="/erro404.html" responseMode="File"/>
<httpErrors>
现在,回到自定义逻辑。如果你真的需要使用Global.asax,我建议你使用这样的东西:
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Response.Clear();
HttpException httpException = exception as HttpException;
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
if (httpException == null)
{
routeData.Values.Add("action", "Index");
}
else //It's an Http Exception, Let's handle it.
{
switch (httpException.GetHttpCode())
{
case 404:
// Page not found.
routeData.Values.Add("action", "HttpError404");
break;
case 500:
// Server error.
routeData.Values.Add("action", "HttpError500");
break;
// Here you can handle Views to other error codes.
// I choose a General error template
default:
routeData.Values.Add("action", "General");
break;
}
}
// Pass exception details to the target error View.
routeData.Values.Add("error", exception);
// Clear the error on server.
Server.ClearError();
// Avoid IIS7 getting in the middle
Response.TrySkipIisCustomErrors = true;
// Call target Controller and pass the routeData.
IController errorController = new ErrorController();
errorController.Execute(new RequestContext(
new HttpContextWrapper(Context), routeData));
}
答案 1 :(得分:1)
你做错了。
~
返回应用程序根目录的物理路径,但显然是我的更改。
使用Server.MapPath()
方法检查案例中哪条路径是正确的。请遵循以下列表:
Server.MapPath(".")
返回正在执行的文件的当前物理目录(例如aspx)Server.MapPath("..")
返回父目录Server.MapPath("~")
返回应用程序根目录的物理路径Server.MapPath("/")
返回域名根目录的物理路径(不一定与应用程序的根目录相同)也可以查看this brilliant answer。