我在尝试在MVC 2中使用自定义404和500错误页面时遇到了一些错误。我基本上是在尝试实现我在此处找到的内容:http://www.genericerror.com/blog/2009/01/27/ASPNetMVCCustomErrorPages.aspx到目前为止,我有:
在我的Web.config中放置以下行:
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/Http500" />
在我的路线表中放置以下路线最后:
routes.MapRoute(
null,
"{*path}",
new { controller = "Error", action = "Http404" }
);
然后,创建了以下控制器:
public class ErrorController : Controller
{
//
// GET: /Error/Http500
public ActionResult Http500()
{
Response.StatusCode = (int)HttpStatusCode.InternalServerError;
return View("my500");
}
//
// GET: /Error/Http404/Path
public ActionResult Http404(string path)
{
Response.StatusCode = (int)HttpStatusCode.NotFound;
return View("my404", path);
}
}
所有这些,对于500个错误,my500视图没有被渲染。相反,它看起来像是再次显示通用的默认Error.aspx视图。对于404错误,我收到YSOD告诉我在我的Web.config中打开自定义错误。我不确定我错过了什么,或者我是否走在正确的轨道上。
编辑:两个视图都在视图/共享
中答案 0 :(得分:1)
如果出现Http 500错误,您可能会获得默认页面,因为您的控制器已应用HandleError
属性。您可以在HandleError
attribute中为要在其中指定的错误类型指定一个视图,但在处理HttpException
时却没有很好的开发。如果从控制器中删除此属性,则默认的asp.net内容应该接管。您也可以覆盖基本控制器中的OnException
。
Http 404错误,there is an overload for return View(string, string);
您无意中使用了这些错误。将路径转换为对象(meh)或使用命名参数(hooray),它将使用路径作为视图的模型。现在它认为这是您要使用的母版页的名称。
这是一个难题,您还可以找到更多信息here。
有点挑剔,但我 HIGHLY 建议仅在继承Response.StatusCode
的类的.Execute()
方法中设置ActionResult
。从概念上讲,操作的结果是应该构建响应的代码的一部分,并且在ActionResult
之外实现部分,就像在控制器中执行的那样,很容易导致很难找到错误。我知道MVC2附带的HttpStatusCodeResult
不允许您选择一个视图与结果一起返回,但是从ViewResult
推送自己的继承是非常简单的。