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

У меня есть строго типизированный Partial View, который принимает 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++;
}

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

@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>

Ответ 4

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

ViewData["currentIndex"] = index;

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

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

ViewBag.AnotherValue = valueToView;

Ответ 8

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

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

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