web-dev-qa-db-ja.com

ASP.NET MVC3の部分ビューでViewBagにアクセスできません

ビューを呼び出すコントローラーがあります。ビューにはPartialViewというbe @Html.Partial("ViewName", model).という名前があります。これは正常に機能します。

しかし、controllerでは、ビューに渡すビューモデルに入れるのが難しいものをビューバッグに入れたいと思います。メインビューはViewBagにアクセスしても問題ありませんが、PartialViewでは何も返しません。

この場合ViewBagを使用することは可能ですか、またはこのデータをビューに渡すモデル(およびPartialViewに渡すモデル、およびモデルI最初のPartialViewにネストされたPartialViewに渡しますか?

52
SoonDead

問題なく動作するはずです。 HomeController Indexアクションで、ViewBagにメッセージを追加します。

ViewBag.Message = "Welcome to ASP.NET MVC!";

インデックスビューで、部分ビューを追加します。

@Html.Partial("ViewName")

そして、部分ビューでメッセージをレンダリングします:

@ViewBag.Message

以下のコメントから:モデルを部分ビューに渡すときに問題があるようです。次に、元のViewBagを参照できます

@ViewContext.Controller.ViewBag.Message
46
slfan

Html.Partial()のオーバーロードを使用している場合、viewDataは入力パラメーターの1つです。例:

_@Html.Partial("PartialViewName", Model, new ViewDataDictionary(ViewBag))
_

部分ビューには、元のViewBagからのデータは表示されません。

new ViewDataDictionary(ViewBag)を削除してください。

_@Html.Partial("PartialViewName", Model)
_
31

コメントで TehOne 言った:

私はこれが少し古いことを知っていますが、将来の参照のために、ViewContext.Controller.ViewBag.Propertyを使用してこれを解決しました。もちろん、これは、アクセスしようとしているViewBagプロパティがコントローラーで設定されたことを意味しますが、これは十分に一般的なケースだと思います。

それが私のために働いたものです。

10
jmoreno

最近、私は同じ問題を経験していましたが、ここでの答えは、Html.PartialviewDataを使用します。しかし、これらのオーバーロードを使用する必要がある場合、正しい答えは次のとおりです。

@Html.Partial(
     "PartialViewName",
     model_object,
     new ViewDataDictionary() { { "Value1InViewBag", ViewBag.Value1InViewBag }, { "Value2InViewBag", ViewBag.Value2InViewBag } }
)

別のViewDataDictionaryを渡す必要がある場合(たとえば、HtmlFieldPrefixを変更するためにそれを使用する場合)、ビューで知る必要があるため、ViewBagに必要な部分ビューを使用する必要があるため、この答えを使用する必要があると思います。 ViewBagのパラメーターは、部分ビューで使用される新しいViewBagにコピーされます(明らかにViewBagViewDataの値を使用します)。

8
Zoka

>一般的なシナリオで、Html.Partialを使用する場合。

Html.Partial("partialViewName");

ParentViewに送信されるモデルは、partialViewNameで使用できます。さらに、parentViewに送信されるViewDataはpartialViewNameにも使用できます。

>特別なケースとして、Html.Partialを使用し、Modelを送信する場合。

Html.Partial("partialViewName", newModel);

ParentViewに送信されたモデルに到達できません。したがって、これからpartialViewNameでアクティブなModelはnewModelです。 parentViewに送信されるviewDataはpartialViewNameにも使用できます。

>特別なケースとして、Html.Partialを使用し、ViewDataDictionaryを送信する場合。

ParentViewに送信されるModelはpartialViewNameにも使用できます

I。

@Html.Partial("partialViewName", new ViewDataDictionary { { "key", value }, { "key2", value2 }  })

ここでは、parentViewに送信されたViewDataが「新しいViewDataDictionary」によって上書きされます。

ここで、parentView用のViewBagがある場合、上記のようなコードを記述すると、それに到達できません。

II。

ViewDataDictionary viewDataDictionary =  new ViewDataDictionary();
viewDataDictionary.Add("key", value);
viewDataDictionary.Add("key2", value2);
@Html.Partial("partialViewName", viewDataDictionary)

この使用法は、最初の使用法(I.)と同じです。

III。

ViewDataDictionary viewDataDictionary = ViewData; //If you use this code block,  ViewBag which is sent for parent View is not lost.
viewDataDictionary.Add("key", value);
viewDataDictionary.Add("key2", value2);
@Html.Partial("partialViewName", viewDataDictionary)

このコードブロックを使用すると、partialViewNameのparentViewに送信されるViewDataおよびViewBagに到達できます。

2

私は非常に基本的なページでこの同じ問題を抱えていました:

@Html.Partial("_AppIntro")

<div class="form-group row">
    <div class="col-md-10">
        <a href="/Ag/Application/1" class="btn btn-default btn-primary">Next</a>
    </div>
</div>

また、部分ビューには、コントローラーから渡された動的な値を取得するためのViewBagへの参照を含むテキストのみが含まれていました。部分ビューの名前が重要であることが判明しました。部分ページを削除して、[追加]-> [表示]-> [MVC 5ビュー]で再作成しましたが、ページに_AppIntro.cshtmlという名前を付けて修正しました。

0
John Sully

私のシナリオは、Model IEnumerable<SampleModel>を使用して渡す必要がありましたが、coz Model.SampleModelListはnullになります

@Html.Partial("PartialViewName", Model.SampleModelList, new ViewDataDictionary())

単純な解決策は、PartialViewもViewの一部であるため、Viewのすべての要素にPartialViewからアクセスできるため、ViewBagの代わりにViewBagデータをView htmlのdata-elementに設定したためです。

<div class="showcase-heading" id="dvValue" data-id="@Model.ContentId">@Model.Name</div>
0
brykneval