更改自定义Http404错误页面的默认视图文件夹

本文关键字:默认 视图 文件夹 自定义 Http404 错误 | 更新日期: 2024-09-20 21:03:37

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

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

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

默认ViewEngine不检查此文件夹(它只检查我的AreasViews文件夹和所有views文件夹)。因此,我使用ViewEngineExtension并将其添加到Global.asaxApplication_Start()中的System.Web.Mvc.ViewEngines集合中。我的所有应用程序都运行得很好,可以访问我的布局和其他BaseViews内容。

关于Global.asaxApplication_Error(),我说不出同样的道理。此方法忽略以前的视图引擎,只查看默认的视图文件夹。我试着像ViewEngines.Engines.Add(new BaseViewsEngineExtension());那样在Application_Error()方法中添加我的ViewEngineExtension,但它没有改变任何东西。这与我在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视图?

更改自定义Http404错误页面的默认视图文件夹

正如SLaks所说,您应该在ErrorController中返回视图的完整路径。
  public class ErrorController : Controller
  {
      public ActionResult Http404()
      {
          return View("~/BaseViews/Error/Http404.cshtml");
      }
  }

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

Request.StatusCode = 200;

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

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

相关文章: