3

私はこれを簡潔に保つようにします:

ビューで

@Html.RenderPartial("myview", Model.SubModel, 
     new ViewDataDictionary()
     {
          { "thing", Model.Thing }
     })

myviewでは、「thing」が使用可能であることがわかります。つまり、これによりModel.Thingの値がmyviewビューで生成されます。

@ViewBag.thing

素晴らしい!単純

しかし、私は物事で何かをする必要があります(そして、物事はサブモデルの一部になることはできません)。つまり、ビューエンジンまたは理想的にはコントローラーでこれにアクセスします。例:

public ActionResult myview(SubModelType vm)
{
    var thing = ViewBag.thing; // oh dear this doesnt exist.. but is there when the view is rendered

だから私の質問は、ViewBagが結果のmyviewで利用できる場合、それはhttpcontextで、またはどこかでcontrollercontextで何らかの形で渡されている必要があるということです。コントローラーで使用できないのにビューに表示されている理由と、これにアクセスする方法を知っている人はいますか?

編集

申し訳ありませんが、ここで重要なポイントを逃しました!「myview」がコントローラーにポストバックされ、myviewと呼ばれるアクションが呼び出され、myviewにレンダリングされたViewBagが使用可能になると予想されます。しかしもちろんそうではありません、それは「myview」で使われました、そしてそれはそれです。したがって、myviewアクションで使用する場合は、そのビューのViewBagに格納するか、アクションに戻すことができるようにビューモデルの値を設定する必要があります。

それは理にかなっていますか?

4

1 に答える 1

1

申し訳ありませんが、ここで重要なポイントを逃しました!「myview」がコントローラーにポストバックされ、myviewと呼ばれるアクションが呼び出され、myviewにレンダリングされたViewBagが使用可能になると予想されます。

ああ、いや、あなたはおそらくそのようなことを期待することはできません。これは、ASP.NETMVCの動作方法ではありません。HTTPリクエストをコントローラーアクションに送信すると、デフォルトのモデルバインダーがこのリクエストをインターセプトし、リクエストから投稿された値を調べて、アクション引数にバインドします。

[HttpPost]
public ActionResult myview(SubModelType vm, ThingViewModel thing)
{
    ...
}

これは明らかに、それらの値が元のリクエストの一部であったことを前提としています。したがって、たとえば、フォームを送信する場合は、モデルバインダーが使用できる対応するフィールドをこのフォーム内に含める必要があります。

そのように考えてください。ASP.NETMVCコントローラーアクションは、任意のクライアントから呼び出すことができます。たとえば、iPhoneアプリケーションから。そしてご存知のようViewBagに、iOSのような概念はありません。発生するのは、デフォルトのモデルバインダーがPOSTされた値を確認し、アクションが引数として取っているビューモデルをハイドレイトしようとすることだけです。

一方、リクエストの一部としてこれらの値を作成できない場合(フォームに対応する入力フィールドを含めることにより)、非表示フィールドからこのシンのIDを送信することしかできず、コントローラーアクション内でこのIDを使用してクエリを実行できますこのフォームを最初にレンダリングしたときに最初に取得したのと同じ場所からモノを取得するための基になるデータストア。

また、セッション内にThingを保存し、POSTアクションでセッションから値を読み戻すことを提案する人もいます。私はそれらの人々の出身ではありません。ただし、これは代替アプローチです。

于 2013-02-03T18:02:57.180 に答える