Передать дополнительные 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, его не будет в этом новом словаре, который вы передаете в частичное представление.


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 } }
); 

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>

2
Это кажется наиболее полным ответом (хотя .ToString () не требуется).
Колин


6

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

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

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

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


4

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


1

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

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

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       this.ViewData
); 

Спасибо! Это очень полезно , когда вы расширяете словарь ViewData для ребенка частичного и т.д.
developius

1

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

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

<partial name="_Partial" for="PartialViewModel" view-data="ViewData" />

0

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

ViewBag.AnotherValue = valueToView;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.