私が構築している 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 を設定する必要があることです。
このアプローチは理にかなっていますか?これはこの問題を解決する良い方法ですか、それともより良いアプローチがありますか?
ありがとう、エリック