Передайте додаткові 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 за замовчуванням, яку за замовчуванням мають усі ваші інші представлення. Якщо ви додаєте що-небудь до ViewData, це не буде в цьому новому словнику, який ви переходите до часткового перегляду.


2
Я намагаюся це зробити, і він повертається "не може перетворити недійсність на об'єкт".
programad

4
@programad Спробуйте видалити @ з @ Html.RenderPartial (), це вирішило цю проблему для мене, але я викликав RenderPartial () на лінії в блоці коду @ {}.
danjarvis

5
Я рекомендую переглянути відповідь ctorx нижче. Він додає додаткові дані до існуючих ViewData.
raRaRa

162

Щоб розширити кількість розміщених утробок, ви можете передавати нові дані перегляду, зберігаючи існуючі дані перегляду, якщо ви використовуєте конструктор перевантаження 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.