0

我想在我的asp.net mvc3网站自定义错误页面。更改自定义Http404错误页面的默认视图文件夹

所以,我发现这非常有用的帖子:Custom error pages on asp.net MVC3,而且运作良好

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

此文件夹没有被默认的ViewEngine(它只检查Views文件夹和我的Areas的所有views文件夹)检查。因此,我使用ViewEngineExtension并将其添加到我的Global.asaxApplication_Start()中的System.Web.Mvc.ViewEngines集合中。我的所有应用程序工作得很好,可以访问我的布局和其他东西。我不能说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)视图引擎来搜索我Http404.cshtml视图中BaseViews文件夹?

回答

0

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

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

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

Request.StatusCode = 200; 

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

+0

我仍然不知道如何在'Application_error'中定义视图引擎,但没关系。将'StatusCode'改为200就可以了,谢谢。 – Florent 2012-08-02 10:19:00

0

更改Http404操作将完整路径返回到其视图。

+0

我不确定明白你的意思吗?你能更具体吗? – Florent 2012-08-01 19:24:16