我有以下代码处理在操作结果之外发生的所有执行(HandleErrorAttribute 无法到达)。
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Response.Clear();
HttpException httpException = (HttpException)exception;
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
if (httpException == null)
{
routeData.Values.Add("action", "Home");
}
else //It's an Http Exception, Let's handle it.
{
routeData.Values.Add("action", "Handle");
}
// Pass exception details to the target error View.
routeData.Values.Add("error", httpException);
// 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 SPP.Areas.UI.Controllers.ErrorController();
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
这可以很好地完成工作。它在“错误”控制器上执行“处理”操作,就像我设置它一样。没问题。
在操作内部时,它会引发另一个异常,然后由我的 HandleErrorAttribute 过滤器拾取。调试后我可以清楚地看到它正在寻找以下路径。
- ~/Views/Error/Handle.aspx
- ~/Views/Error/Handle.ascx
- ~/Views/Shared/Handle.aspx
- ~/Views/Shared/Handle.ascx
- ~/Views/Error/Handle.cshtm
- ~/Views/Error/Handle.vbhtml
- ~/Views/Shared/Handle.cshtml
- ~/Views/Shared/Handle.vbhtml
我正在使用 Razors 视图引擎和Areas。我这样做的原因。所以我可以让我的应用程序保持整洁。我的问题是,看起来我被迫在我的应用程序中创建一个目录,只是为了让这个文件可以放在其中......我不喜欢这个。
我更喜欢它去以下位置。
- ~/Areas/UI/Views/Error/Handle.cshtml
或者类似的东西...
- ~/Areas/Shared/Views/Error/Handle.cshtml
现在我可以通过在应用程序的根目录创建该目录来解决这个问题。
我没有这样做的原因是因为如果我开始屈服并使用一种简单的方法。我的应用程序很快就会变得非常混乱。我喜欢成为定义我的文件和文件夹所在位置的人。
如果有人知道设置直接路径的方法,或者告诉 IController (errorcontroller) 查看已实例化的区域,我会永远爱你。
任何帮助都感激不尽。
史蒂夫