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

174

У меня есть строго типизированное частичное представление, которое принимает 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++;
}
Натан Тейлор
источник

Ответы:

251

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

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

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

WOMP
источник
2
Я пытаюсь сделать это, и он возвращает "не может преобразовать void в объект".
programad
4
@programad Попробуйте удалить @ из @ Html.RenderPartial (), это исправило эту проблему для меня, но я вызывал RenderPartial () в строке внутри блока кода @ {}.
Данжарвис
5
Я рекомендую проверить ответ ctorx ниже. Он добавляет дополнительные данные к существующим ViewData.
raRaRa
162

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

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary(this.ViewData) { { "index", index } }
); 
ctorx
источник
3
это может быть очень полезно, если вам нужно сохранить TemplateInfo.HtmlFieldPrefixдочерний элемент управления, который будет сброшен в противном случае
Simon_Weaver
12
Это определенно лучшее решение. Потеря ViewData означает, что вы потеряете ModelState и все проверки. +1
Кевин Фарругия
Кажется, это работает, только если вы не передаете TemplateInfo.HtmlFieldPrefix в свой ViewDataDictionary. Я могу передать только переменную, показанную в ответе, или передать TemplateInfo.HtmlFieldPrefix, но не оба сразу.
Ferox
45
@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>
muthuvel
источник
2
Это кажется наиболее полным ответом (хотя .ToString () не требуется).
Колин
9

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

ViewData["currentIndex"] = index;
Джоэл Мартинес
источник
6
Хотя это не очень сильный способ сделать это, он помог мне понять, как извлечь значение представления данных из ответа Womp.
Матиас Ликкегор Лоренцен
6

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

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

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

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

griegs
источник
4

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

tvanfosson
источник
1

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

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

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       this.ViewData
); 
MithunChopda
источник
Спасибо! Это очень полезно , когда вы расширяете словарь ViewData для ребенка частичного и т.д.
developius
1

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

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

<partial name="_Partial" for="PartialViewModel" view-data="ViewData" />
Drytin
источник
0

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

ViewBag.AnotherValue = valueToView;
Jack1987
источник