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


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

7 ответов:

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

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

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

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

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary(this.ViewData) { { "index", index } }
); 
@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>

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

ViewData["currentIndex"] = index;

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

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

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

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

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

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

ViewBag.AnotherValue = valueToView;