Передайте додаткові 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.