在MVC 2中尝试使用自定义404和500个错误页时,我遇到了一些错误。
在我的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中打开自定义错误。我不知道我错过了什么,或者我是否走上了正确的轨道。
编辑:两个视图都在视图/共享中
发布于 2011-04-25 19:56:35
使用Http 500错误时,您可能会得到默认页面,因为您将HandleError属性应用于控制器。您可以在属性中为您希望指向的错误类型指定一个视图,但是对于处理HttpException的错误类型还没有很好的开发。如果您从控制器中删除了这个属性,默认的asp.net内容应该会接管。您还可以在基本控制器中重写OnException。
带有Http 404错误,有一个过载 return View(string, string);,这是您无意中使用的。将路径转换为对象(meh)或使用命名参数(hooray),它将使用路径作为视图的模型。现在,它认为这是要使用的母版页的名称。
这是一个困难的问题,你也可以找到更多的信息这里。
有点挑剔,但我也强烈建议只在继承ActionResult的类的.Execute()方法中设置Response.StatusCode。从概念上讲,操作的结果是代码的一部分,它应该构建响应,并且在ActionResult之外实现响应部分,就像您在控制器中所做的那样,很容易导致很难找到bug。我知道随MVC2一起提供的MVC2不允许您选择一个视图与结果一起返回,但是将您自己从ViewResult继承的内容转到一起是相当简单的。
https://stackoverflow.com/questions/5761573
复制相似问题