我正在构建的 MVC 应用程序有一部分页面(作为部分实现)使用从 ViewData 加载的 ViewModel。我创建了一个抽象控制器,我的所有控制器都继承自(我使用的 IoC 系统使基本控制器成为最佳选择)。目前,我正在 OnActionExecuting 覆盖中设置数据。
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
ViewData["OperationStatusVM"] = OperationsStatusBuilder.Get(Operations);
base.OnActionExecuting(filterContext);
}
问题是 OperationsStatusBuilder 方法运行时间相当长。我正在尝试组合一种方法来填充 ViewModel 而不会阻塞请求的其余部分。
我的第一个想法是通过 OnActionExecuting 中的 Task 开始操作,然后在 OnActionExecuted 中设置实际值。
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.RequestContext.HttpContext.Items["OperationTask"]
= Task<OperationsStatusVM>.Factory.StartNew(() => OperationsStatusBuilder.Get(Operations));
base.OnActionExecuting(filterContext);
}
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
var task = filterContext.RequestContext.HttpContext.Items["OperationTask"] as Task<OperationsStatusVM>;
ViewData["OperationStatusVM"] = task.Result;
base.OnActionExecuted(filterContext);
}
我仍在解决问题,但似乎我可能错过了使用 MVC 内置的东西的机会。我的主要要求是必须在呈现页面时设置 ViewData。
这种方法有意义吗?这是解决这个问题的好方法,还是有更好的方法?
谢谢,埃里克