0

我想在我的 asp.net mvc3 网站中自定义错误页面。

所以,我发现这篇非常有用的帖子:asp.net MVC3 上的自定义错误页面,它运行良好

但是,我的Http404.cshtml文件不在Views默认文件夹中。它位于一个名为BaseViews. 我已经_Layout.cshtml在该文件夹中有我的视图和其他视图或部分视图。

默认情况下不检查此文件夹ViewEngine(它只检查文件夹和myViews的所有文件夹)。因此,我使用 ViewEngineExtension 并将其添加到我的. 我所有的应用程序都运行良好,可以访问我的布局和其他内容。viewsAreasSystem.Web.Mvc.ViewEnginesGlobal.asaxApplication_Start()BaseViews

我不能对Global.asax's说同样的话Application_Error()。此方法忽略以前的视图引擎,只查看默认视图文件夹。我试图Application_Error()像这样在方法中添加我的 ViewEngineExtension ,ViewEngines.Engines.Add(new BaseViewsEngineExtension());但它没有改变任何东西。这与我在Application_Start().

请参阅我的代码Application_Error()

protected void Application_Error()
{
    var exception = Server.GetLastError();
    var httpException = exception as HttpException;
    Response.Clear();
    Server.ClearError();
    var routeData = new RouteData();
    routeData.Values["controller"] = "Error";
    routeData.Values["action"] = "Index";
    routeData.Values["exception"] = exception;
    Response.StatusCode = 500;
    if (httpException != null)
    {
        Response.StatusCode = httpException.GetHttpCode();
        switch (Response.StatusCode)
        {
            case 404:
                routeData.Values["action"] = "Http404";
                break;
        }
    }

    IController errorController = new ErrorController();
    var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
    errorController.Execute(rc);
}

我的问题是:如何强制errorController.Excecute(rc)视图引擎在BaseViews文件夹中搜索我的 Http404.cshtml 视图?

4

2 回答 2

0

更改Http404操作以返回其视图的完整路径。

于 2012-08-01T18:14:53.953 回答
0

正如 SLaks 所说,您应该在 ErrorController 中返回视图的完整路径。

  public class ErrorController : Controller
  {
      public ActionResult Http404()
      {
          return View("~/BaseViews/Error/Http404.cshtml");
      }
  }

但它不起作用,因为你的错误被覆盖了,所以你没有得到预期的结果。为了绕过这个问题,你可以告诉你的应用程序在你的 application_error 中一切正常:

Request.StatusCode = 200;

我希望它能解决你的问题。

于 2012-08-02T10:11:23.240 回答