1

次のコントローラー アクションがあります。

public ActionResult MyAction(...)
{
    ActionResult result = View("MyView", new MyModel());

    var fruit = TempData["Fruit"];
    // Do something with the fruit

    return result;
}

そしてこの MyView.cshtml

@model MyModel
@{ 
    TempData["Fruit"] = "Mango";
}

が設定されているビューにブレークポイントを配置すると、アクションTempData["Fruit"]の " " の前に呼び出されません。レンダリングが遅れているようですreturn resultRazor

result = View(..)呼び出しから戻ったときにビューを強制的にレンダリングするにはどうすればよいですか?

注: この単純な例について心配する必要はありません。これに対する解決策が本当に必要な実際のユースケースがありますが、これ以上質問に負担をかけたくありませんでした.

4

1 に答える 1

1

ビューは、アクションが完了するまでレンダリングされません。次のように、result.ExecuteResult(ControllerContext) を呼び出して、アクション内で ActionResult の早期実行を強制できます。

    ActionResult result = View("Details", new PageModel(page));
    result.ExecuteResult(ControllerContext);

ただし、アクションが結果を返すときに ActionResult が再度実行されるため、問題が発生します。そのため、その 2 回目の実行をキャンセルする必要があります。

これは次のように行うことができます。

    protected override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        if (cancelTheResult)
        {
            filterContext.Cancel = true;
        }
        base.OnResultExecuting(filterContext);
    }

これはすべてちょっとしたハックのように見えますが、いくつかのシナリオでは必要と思われます。たとえば、子アクションが最上位アクションにリダイレクトを実行するように指示する必要がある場合、子アクションが完了するまでリダイレクトが必要であることはわかりませんが、子アクションは手遅れになるまで完了しません。これが私が見つけた唯一の回避策です。

于 2013-02-13T05:59:13.633 に答える