32

私はこれと混同しています:私は親と言うアクションを持っています、そして対応するビューファイルで、私は子アクション、例えば子を呼び出しました、親と子の両方のアクションは同じコントローラーにあります。

ViewBag.Now で一部のデータを共有するには、子アクションと親アクションが必要です。どうすればよいですか?ここに私の質問があります:

親のビュー ファイルで Child アクションを呼び出すと、ビューバッグを @Html.Action(ViewBag) のように渡します。私の子アクションでは、これを行います:

public PartialViewResult Child(Object ViewBag)
{
  //using the data in ViewBag
}

これは正しい方法ですか?ビューバッグ オブジェクトは参照渡しですか、それとも元のビューバッグとは異なるオブジェクトですか (より多くのメモリが必要です)?

または、Child アクションがデフォルトで呼び出し元の親 Action とビューバッグを共有している場合はどうなりますか?

Darin Dimitrov の回答から、@Html.Action(ViewBag) のようなことはできないことがわかりました。

しかし、私は本当に子アクションのマルチパラメータを渡す必要があります.どうすればよいですか?

4

2 に答える 2

42

子アクションは、親アクションとは異なるコントローラー/モデル/ビューのライフサイクルに従います。結果として、それらはViewData/ViewBagを共有しません。親から子アクションにパラメーターを渡したい場合は、次のようにすることができます。

@Html.Action("Child", new { message = ViewBag.Message })

と子のアクションで:

public ActionResult Child(string message)
{
    ...
}
于 2011-10-12T08:25:24.263 に答える
14

方法はありますが、カミソリ ビューの基本クラスとしてカスタム抽象クラスを作成する必要があります。次に、必要なものを親から子のアクションに公開します。これは、WebViewPage から継承するクラス内でルート コントローラーの ViewBag を取得する方法です。

    private dynamic GetPageViewBag()
    {
        if (Html == null || Html.ViewContext == null) //this means that the page is root or parial view
        {
            return ViewBag;
        }
        ControllerBase controller = Html.ViewContext.Controller;

        while (controller.ControllerContext.IsChildAction)  //traverse hierachy to get root controller
        {
            controller = controller.ControllerContext.ParentActionViewContext.Controller;
        }
        return controller.ViewBag;
    }
于 2012-10-31T22:52:02.137 に答える