web-dev-qa-db-ja.com

子アクションは、その「親」アクションと同じViewBagを共有しますか?

私はこれと混同しています:私にはアクションがあります。たとえば、ペアレントであり、対応するビューファイルで、子アクションと呼ばれています。たとえば、チャイルドと呼ばれます。

そして、ViewBag.Nowのデータを共有するために、ChildアクションとParentアクションが必要です。どうすればよいですか?これが私の質問です。

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

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

これは正しい方法ですか?参照渡しされたビューバッグオブジェクトは、元のビューバッグとは異なるオブジェクトですか?

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

ダリン・ディミトロフの答えから、私はこのようなことはできないことを知っていました:@ Html.Action(ViewBag)

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

32
NextStep

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

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

と子供の行動で:

public ActionResult Child(string message)
{
    ...
}
40
Darin Dimitrov

方法はありますが、カミソリビューの基本クラスとしてカスタム抽象クラスを作成する必要があります。次に、親から子へのアクションに必要なものをすべて公開します。これは、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;
    }
14
mitsbits