Не удается получить доступ к ViewBag в частичном представлении в ASP.NET MVC3
У меня есть контроллер, вызывающий представление. В представлении есть PartialView
, называемый be @Html.Partial("ViewName", model).
Это отлично работает.
Но в controller
я хочу поместить что-то в сумку, что было бы трудно поместить в viewmodel, я перехожу к представлению.
В главном представлении нет проблем с доступом к ViewBag
, но в PartialView
он ничего не возвращает.
Можно ли использовать ViewBag
в этом случае или я должен "взломать" эти данные в модель, которую я передаю в представление (и модель переходит к PartialView
, а модель переходит на PartialView
вложен в первый PartialView
)?
Ответы
Ответ 1
Это должно работать без проблем. В своем действии HomeController Index я добавляю сообщение в ViewBag:
ViewBag.Message = "Welcome to ASP.NET MVC!";
В индексном представлении я добавляю частичное представление:
@Html.Partial("ViewName")
И на частичном представлении я рендерил сообщение:
@ViewBag.Message
Из комментариев ниже: кажется, что есть проблема, когда вы передаете модель в частичное представление. Затем вы можете сослаться на оригинальный ViewBag с
@ViewContext.Controller.ViewBag.Message
Ответ 2
Если вы используете перегрузку Html.Partial()
, где viewData
- один из входных параметров, например:
@Html.Partial("PartialViewName", Model, new ViewDataDictionary(ViewBag))
тогда ваше частичное представление не будет видеть данные из вашего исходного ViewBag.
Удалите new ViewDataDictionary(ViewBag)
, поэтому вы должны написать
@Html.Partial("PartialViewName", Model)
Ответ 3
В комментарии TehOne говорится:
Я знаю, что это немного устарело, но для будущей ссылки я решил это используя ViewContext.Controller.ViewBag.Property. Конечно, это означает что свойство ViewBag, к которому вы пытаетесь получить доступ, было установлено в контроллер, но я думаю, что это достаточно распространенный случай.
Это то, что сработало для меня.
Ответ 4
В последнее время у меня была такая же проблема, но ответы здесь были обходными, поскольку они предлагают не использовать перегрузку Html.Partial
с помощью viewData
. Но если вам пришлось использовать эти перегрузки, я верю, что правильный ответ:
@Html.Partial(
"PartialViewName",
model_object,
new ViewDataDictionary() { { "Value1InViewBag", ViewBag.Value1InViewBag }, { "Value2InViewBag", ViewBag.Value2InViewBag } }
)
Я думаю, что этот ответ следует использовать, если вам нужно передать разные ViewDataDictionary
(например, я его для изменения HtmlFieldPrefix
), и потому что в представлении, которое вы должны знать, какое частичное представление нужно в ViewBag
, поэтому не должно быть проблемой назвать все параметры из ViewBag для копирования в новый ViewBag
, используемый в частичном представлении (видимо ViewBag
использует значения из viewData
).
Ответ 5
Мой сенарио был, у меня был частичный вид с Model IEnumerable<SampleModel>
Однако мне пришлось пройти с использованием, coz Model.SampleModelList может быть null
@Html.Partial("PartialViewName", Model.SampleModelList, new ViewDataDictionary())
Простое решение было с тех пор, как PartialView теперь также является частью представления. Каждый элемент в представлении может получить доступ к PartialView, поэтому я установил данные ViewBag для элемента данных в представлении html вместо ViewBag.
<div class="showcase-heading" id="dvValue" data-id="@Model.ContentId">@Model.Name</div>
Ответ 6
У меня была такая же проблема с очень простой страницей:
@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 для извлечения некоторых динамических значений, переданных из контроллера. Оказалось, что имеет значение название частичного представления. Удаление частичной страницы и ее повторное создание с помощью Add → View → MVC 5 View, но именование страницы _AppIntro.cshtml исправлено.
Ответ 7
> В общем случае, когда вы используете Html.Partial;
Html.Partial("partialViewName");
Модель, которая отправляется для parentView, может использоваться для в componentViewName. Кроме того, ViewData, который отправляется для parentView, также может использоваться для частичного ViewName.
> Как особый случай, когда вы используете Html.Partial и хотите отправить Model.
Html.Partial("partialViewName", newModel);
Вы не можете добраться до модели, которая была отправлена для parentView. Следовательно, с сегодняшнего дня Модель, которая активна вpartalViewName, является newModel. ViewData, который отправляется для parentView, может использоваться также для частичного ViewName.
> Как особый случай, когда вы используете Html.Partial и хотите отправить ViewDataDictionary..
Модель, которая отправляется для parentView, может использоваться также для частичного просмотра.
Я.
@Html.Partial("partialViewName", new ViewDataDictionary { { "key", value }, { "key2", value2 } })
Здесь ViewData, который был отправлен для parentView, перезаписывается с помощью 'new ViewDataDictionary'.
Здесь, если есть ViewBag для parentView, вы не сможете достичь этого, если напишите код, подобный приведенному выше.
II.
ViewDataDictionary viewDataDictionary = new ViewDataDictionary();
viewDataDictionary.Add("key", value);
viewDataDictionary.Add("key2", value2);
@Html.Partial("partialViewName", viewDataDictionary)
Это использование такое же, как первый (я).
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)
С помощью этого блока кода вы можете получить доступ к ViewData и ViewBag, которые отправляются для parentView в partalViewName.