这就是我想要实现的目标: 我想扩展HandleErrorAttribute,以便我可以重定向到适当的错误页面。我看了一下HandleErrorAttribute的实现,并注意到它本质上只返回一个ViewResult,它指向一个视图,可以按Exception类型定义。
我想使用与HandleErrorAttribute相同的系统,除了:
我显然可以使用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开始重新启动整个管道。
有什么想法吗? 谢谢!
答案 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"]
,然后它就消失了。听起来像你需要的。