我有一个自定义ActionResult用于返回某些HTTP错误,如NotFoundResult和ForbiddenResult,它们都派生自ViewResult.
如果在操作过程中没有在数据库中找到实体,我会将它们用于404的短路操作.
在这些结果对象中,我将HTTP状态设置为适当的数字.当我这样做时,这些ViewResults引用不会呈现的视图.我必须将状态保留为200 OK才能呈现我的视图.
如何在ASP.NET MVC 2.0中设置适当的状态并呈现视图?
解决方法
I have a custom ActionResult for
returning certain HTTP Errors,like
NotFoundResult and ForbiddenResult,
they all derive from ViewResult.
请允许我建议您替代错误处理:
首先创建一个错误控制器和相应的视图:
public class ErrorController : Controller { public ActionResult General() { return View(); } public ActionResult HttpError404() { return View(); } public ActionResult HttpError500() { return View(); } }
在Global.asax中定义Application_Error方法:
protected void Application_Error(object sender,EventArgs e) { var exception = Server.GetLastError(); // TODO: Log the exception with your favorite logging framework Response.Clear(); var httpException = exception as HttpException; var routeData = new RouteData(); // Take the ErrorController routeData.Values.Add("controller","error"); if (httpException == null) { // Use the General action for any unhandled error routeData.Values.Add("action","general"); } else { switch (httpException.GetHttpCode()) { case 404: routeData.Values.Add("action","httpError404"); break; case 500: routeData.Values.Add("action","httpError500"); break; default: routeData.Values.Add("action","general"); break; } } // Add the exception to route data so that the error controller // could use it with RouteData.Values["error"] routeData.Values.Add("error",exception); Server.ClearError(); IController errorController = new ErrorController(); errorController.Execute(new RequestContext(new HttpContextWrapper(Context),routeData)); }
最后抛出适当的例外:
public class HomeController: Controller { public ActionResult Index(int id) { var model = _repository.GetModel(id); if (model == null) { throw new HttpException(404,"Model not found with id = " + id); } return View(model); } }