ビューを呼び出すコントローラーがあります。ビューにはPartialView
というbe @Html.Partial("ViewName", model).
という名前があります。これは正常に機能します。
しかし、controller
では、ビューに渡すビューモデルに入れるのが難しいものをビューバッグに入れたいと思います。メインビューはViewBag
にアクセスしても問題ありませんが、PartialView
では何も返しません。
この場合ViewBag
を使用することは可能ですか、またはこのデータをビューに渡すモデル(およびPartialView
に渡すモデル、およびモデルI最初のPartialView
にネストされたPartialView
に渡しますか?
問題なく動作するはずです。 HomeController Indexアクションで、ViewBagにメッセージを追加します。
ViewBag.Message = "Welcome to ASP.NET MVC!";
インデックスビューで、部分ビューを追加します。
@Html.Partial("ViewName")
そして、部分ビューでメッセージをレンダリングします:
@ViewBag.Message
以下のコメントから:モデルを部分ビューに渡すときに問題があるようです。次に、元のViewBagを参照できます
@ViewContext.Controller.ViewBag.Message
Html.Partial()
のオーバーロードを使用している場合、viewData
は入力パラメーターの1つです。例:
_@Html.Partial("PartialViewName", Model, new ViewDataDictionary(ViewBag))
_
部分ビューには、元のViewBagからのデータは表示されません。
new ViewDataDictionary(ViewBag)
を削除してください。
_@Html.Partial("PartialViewName", Model)
_
コメントで TehOne 言った:
私はこれが少し古いことを知っていますが、将来の参照のために、ViewContext.Controller.ViewBag.Propertyを使用してこれを解決しました。もちろん、これは、アクセスしようとしているViewBagプロパティがコントローラーで設定されたことを意味しますが、これは十分に一般的なケースだと思います。
それが私のために働いたものです。
最近、私は同じ問題を経験していましたが、ここでの答えは、Html.Partial
viewData
を使用します。しかし、これらのオーバーロードを使用する必要がある場合、正しい答えは次のとおりです。
@Html.Partial(
"PartialViewName",
model_object,
new ViewDataDictionary() { { "Value1InViewBag", ViewBag.Value1InViewBag }, { "Value2InViewBag", ViewBag.Value2InViewBag } }
)
別のViewDataDictionary
を渡す必要がある場合(たとえば、HtmlFieldPrefix
を変更するためにそれを使用する場合)、ビューで知る必要があるため、ViewBag
に必要な部分ビューを使用する必要があるため、この答えを使用する必要があると思います。 ViewBagのパラメーターは、部分ビューで使用される新しいViewBag
にコピーされます(明らかにViewBag
はViewData
の値を使用します)。
>一般的なシナリオで、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に到達できます。
私は非常に基本的なページでこの同じ問題を抱えていました:
@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という名前を付けて修正しました。
私のシナリオは、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>