我有一个自定义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);
- }
- }