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

时间:2012-08-01 18:10:50

标签: c# asp.net-mvc-3 http-status-code-404 global-asax viewengine

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

所以,我发现这个非常有用的帖子:Custom error pages on asp.net MVC3并且效果很好

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

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

我无法对BaseViews的{​​{1}}说出同样的话。此方法忽略先前的视图引擎,仅查看默认视图文件夹。 我尝试在Global.asax方法中添加我的ViewEngineExtension,如Application_Error(),但它不会改变任何内容。这与我在Application_Error()中使用的行完全相同。

请参阅我的代码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); } 文件夹中的Http404.cshtml视图?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

但它不起作用,因为您的错误被覆盖,因此您无法获得预期的结果。 要绕过此问题,您可以使用以下命令告诉应用程序:application_error中的所有内容都正常:

Request.StatusCode = 200;

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