RedirectToRouteResult包括模型

时间:2012-03-26 13:23:25

标签: asp.net-mvc asp.net-mvc-3

这就是我想要实现的目标: 我想扩展HandleErrorAttribute,以便我可以重定向到适当的错误页面。我看了一下HandleErrorAttribute的实现,并注意到它本质上只返回一个ViewResult,它指向一个视图,可以按Exception类型定义。

我想使用与HandleErrorAttribute相同的系统,除了:

  1. 我想为错误页面定义Controller
  2. 我想将Exception维护为模型(HandleErrorInfo)
  3. 我显然可以使用RedirectToRouteResult,但我不能将Exception作为模型传递,因为它是一个实际的Response.Redirect。而且我想避免必须缓存模型服务器端。

    现在我只是覆盖了ViewResult并手动设置控制器。但这仍然只是返回视图,并没有实际执行控制器。

    public class ErrorViewResult : ViewResult
    {
        public ControllerBase Controller { get; set; }
        public string ControllerName { get; set; }
    
        protected override ViewEngineResult FindView(ControllerContext context)
        {
            context.Controller = Controller;
            context.RouteData.Values["controller"] = ControllerName;
            return base.FindView(context);
        }
    }
    

    我必须以某种方式返回一个结果,从Controller开始重新启动整个管道。

    有什么想法吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

小心使用TempData功能,它会将值存储到下一个请求,如果在这些请求之间您将执行任何其他请求,或者如果您使用mvc来处理客户端资源(如动态组合的css和js文件),那么你会丢失你的数据。 如果要手动启动控制器(使用所有嵌套操作),请查看:

   RouteData data = new RouteData();
   data.Values.Add("controller", "error");
   data.Values.Add("action", "Handle500");
   data.Values.Add("area", "");
   data.Values.Add("exception", sb.ToString()); 

   var controller = new MTool.BusinessLogic.Controllers.ErrorController();
   controller.ControllerContext = new ControllerContext([HttpContextInstance], data, controller);
   controller.ActionInvoker.InvokeAction(controller.ControllerContext, "Handle500");

答案 1 :(得分:0)

为什么不使用TempData

TempData允许您存储可在下一个请求中读取的数据。如果他们在重定向后刷新页面,它将会消失。

TempData["exception"] = exception;
return RedirectToAction("Index");

现在,只有第一个GET才能访问TempData["exception"],然后它就消失了。听起来像你需要的。