asp.net-mvc – 在ASP.NET MVC控制器结果中设置HTTP状态不呈现视图

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – 在ASP.NET MVC控制器结果中设置HTTP状态不呈现视图前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个自定义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.

请允许我建议您替代错误处理:

首先创建一个错误控制器和相应的视图:

  1. public class ErrorController : Controller
  2. {
  3. public ActionResult General()
  4. {
  5. return View();
  6. }
  7.  
  8. public ActionResult HttpError404()
  9. {
  10. return View();
  11. }
  12.  
  13. public ActionResult HttpError500()
  14. {
  15. return View();
  16. }
  17. }

在Global.asax中定义Application_Error方法

  1. protected void Application_Error(object sender,EventArgs e)
  2. {
  3. var exception = Server.GetLastError();
  4. // TODO: Log the exception with your favorite logging framework
  5.  
  6. Response.Clear();
  7. var httpException = exception as HttpException;
  8.  
  9. var routeData = new RouteData();
  10. // Take the ErrorController
  11. routeData.Values.Add("controller","error");
  12.  
  13. if (httpException == null)
  14. {
  15. // Use the General action for any unhandled error
  16. routeData.Values.Add("action","general");
  17. }
  18. else
  19. {
  20. switch (httpException.GetHttpCode())
  21. {
  22. case 404:
  23. routeData.Values.Add("action","httpError404");
  24. break;
  25. case 500:
  26. routeData.Values.Add("action","httpError500");
  27. break;
  28. default:
  29. routeData.Values.Add("action","general");
  30. break;
  31. }
  32. }
  33.  
  34. // Add the exception to route data so that the error controller
  35. // could use it with RouteData.Values["error"]
  36. routeData.Values.Add("error",exception);
  37.  
  38. Server.ClearError();
  39. IController errorController = new ErrorController();
  40. errorController.Execute(new RequestContext(new HttpContextWrapper(Context),routeData));
  41. }

最后抛出适当的例外:

  1. public class HomeController: Controller
  2. {
  3. public ActionResult Index(int id)
  4. {
  5. var model = _repository.GetModel(id);
  6. if (model == null)
  7. {
  8. throw new HttpException(404,"Model not found with id = " + id);
  9. }
  10. return View(model);
  11. }
  12. }

猜你在找的asp.Net相关文章