我想在我的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视图?
答案 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;
我希望它能解决你的问题。