1

我有以下代码处理在操作结果之外发生的所有执行(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) 查看已实例化的区域,我会永远爱你。

任何帮助都感激不尽。

史蒂夫

4

0 回答 0