Передача дополнительных ViewData в строго типизированное частичное представление

У меня есть строго типизированное частичное представление, которое принимает ProductImage, и когда оно отображается, я также хотел бы предоставить ему некоторые дополнительные ViewData, которые я создаю динамически на содержащейся странице. Как я могу передать мой строго типизированный объект и мои пользовательские ViewData в частичное представление с помощью вызова RenderPartial?

var index = 0;
foreach (var image in Model.Images.OrderBy(p => p.Order))
{
  Html.RenderPartial("ProductImageForm", image); // < Pass 'index' to partial
  index++;
}

person Nathan Taylor    schedule 23.07.2009    source источник


Ответы (9)


RenderPartial принимает другой параметр, который является просто ViewDataDictionary. Вы почти у цели, просто назовите это так:

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary { { "index", index } }
); 

Обратите внимание, что это переопределит ViewData по умолчанию, которые по умолчанию имеют все ваши другие представления. Если вы добавляете что-либо в ViewData, этого не будет в этом новом словаре, который вы передаете в свое частичное представление.

person womp    schedule 23.07.2009
comment
Я пытаюсь сделать это, и он не может преобразовать void в объект. - person programad; 20.01.2012
comment
@programad Попробуйте удалить @ из @ Html.RenderPartial (), это устранило эту проблему для меня, но я вызывал RenderPartial () в строке внутри блока кода @ {}. - person danjarvis; 11.06.2012
comment
Я рекомендую проверить ответ ctorx ниже. Он добавляет дополнительные данные к существующим ViewData. - person Jón Trausti Arason; 24.06.2016

Чтобы расширить то, что опубликовал womp, вы можете передать новые данные представления, сохраняя существующие данные представления, если вы используете перегрузку конструктора ViewDataDictionary, например:

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary(this.ViewData) { { "index", index } }
); 
person ctorx    schedule 11.05.2012
comment
это может быть очень полезно, если вам нужно сохранить TemplateInfo.HtmlFieldPrefix в дочернем элементе управления, который в противном случае будет сброшен - person Simon_Weaver; 06.07.2013
comment
Это определенно лучшее решение. Потеря ViewData означает, что вы потеряете ModelState и все проверки. +1 - person Kevin Farrugia; 07.02.2015
comment
Кажется, это работает, только если вы не передаете TemplateInfo.HtmlFieldPrefix в своем ViewDataDictionary. Я могу передать только переменную, как показано в ответе, или передать TemplateInfo.HtmlFieldPrefix, но не то и другое вместе. - person Ferox; 24.11.2016

@Html.Partial("_Header", new ViewDataDictionary { { "HeaderName", "User Management" }, { "TitleName", "List Of Users" } })
or
@{Html.RenderPartial("_Header", new ViewDataDictionary { { "HeaderName", "User Management" }, { "TitleName", "List Of Users" } });}

Частичная страница (_Header):

<div class="row titleBlock">
    <h1>@ViewData["HeaderName"].ToString()</h1>
    <h5>@ViewData["TitleName"].ToString()</h5>
</div>
person muthuvel    schedule 12.08.2014
comment
Это кажется наиболее полным ответом (хотя .ToString () не нужен). - person Colin; 24.07.2015

Я думаю, это не должно работать?

ViewData["currentIndex"] = index;
person Joel Martinez    schedule 23.07.2009
comment
Хотя это не очень сильный способ сделать это, он помог мне выяснить, как получить значение данных представления из ответа Womp. - person Mathias Lykkegaard Lorenzen; 18.02.2012

Создайте еще один класс, содержащий ваш строго типизированный класс.

Добавьте новый материал в класс и верните его в представление.

Затем в представлении убедитесь, что вы унаследовали свой новый класс и изменили фрагменты кода, которые теперь будут ошибочными. а именно ссылки на ваши поля.

Надеюсь это поможет. Если нет, то дайте мне знать, и я опубликую конкретный код.

person griegs    schedule 23.07.2009

Самый простой способ передать дополнительные данные - добавить данные к существующим ViewData для представления, как отмечает @Joel Martinez. Однако, если вы не хотите загрязнять ваши ViewData, RenderPartial имеет метод, который принимает три аргумента, а также версию с двумя аргументами, которую вы показываете. Третий аргумент - это ViewDataDictionary. Вы можете создать отдельный ViewDataDictionary только для своего партиала, содержащего только дополнительные данные, которые вы хотите передать.

person tvanfosson    schedule 23.07.2009

Я знаю, что это старый пост, но я столкнулся с ним, когда столкнулся с аналогичной проблемой с использованием ядра 3.0, надеюсь, это кому-то поможет.

@{
Layout = null;
ViewData["SampleString"] = "some string need in the partial";
}

<partial name="_Partial" for="PartialViewModel" view-data="ViewData" />
person Drytin    schedule 18.12.2019

Это тоже должно сработать.

this.ViewData.Add("index", index);

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       this.ViewData
); 
person MithunChopda    schedule 10.11.2018
comment
Спасибо! Это действительно полезно, когда вы расширяете словарь ViewData для дочерних элементов и т. Д. - person developius; 03.04.2020

Вы можете использовать динамическую переменную ViewBag

ViewBag.AnotherValue = valueToView;
person Jack1987    schedule 02.12.2015