Не удается получить доступ к ViewBag в частичном представлении в ASP.NET MVC3 - программирование
Подтвердить что ты не робот

Не удается получить доступ к ViewBag в частичном представлении в ASP.NET MVC3

У меня есть контроллер, вызывающий представление. В представлении есть PartialView, называемый be @Html.Partial("ViewName", model). Это отлично работает.

Но в controller я хочу поместить что-то в сумку, что было бы трудно поместить в viewmodel, я перехожу к представлению. В главном представлении нет проблем с доступом к ViewBag, но в PartialView он ничего не возвращает.

Можно ли использовать ViewBag в этом случае или я должен "взломать" эти данные в модель, которую я передаю в представление (и модель переходит к PartialView, а модель переходит на PartialView вложен в первый PartialView)?

4b9b3361

Ответ 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.