2009-07-23 8 views
144

Tengo una vista parcial fuertemente tipada que toma una imagen del producto y cuando se representa también me gustaría proporcionarle algunos datos de vista adicionales que creo dinámicamente en la página que contiene. ¿Cómo puedo pasar tanto mi objeto fuertemente tipado como mi ViewData personalizado a la vista parcial con la llamada RenderPartial?Pase datos de vista adicionales a una vista parcial fuertemente tipada

var index = 0; 
foreach (var image in Model.Images.OrderBy(p => p.Order)) 
{ 
    Html.RenderPartial("ProductImageForm", image); // < Pass 'index' to partial 
    index++; 
} 

Respuesta

208

RenderPartial toma otro parámetro que es simplemente un ViewDataDictionary. Ya casi ha terminado, simplemente llame así:

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

Tenga en cuenta que esto va a reemplazar el valor predeterminado ViewData que todos sus otros puntos de vista tienen por defecto. Si está agregando algo a ViewData, no estará en este nuevo diccionario que está pasando a su vista parcial.

+1

Estoy tratando de hacer esto y me está devolviendo "no puedo convertir el vacío en objeto". – programad

+3

@programad Prueba a eliminar @ de @ Html.RenderPartial(), esto me solucionó ese problema, pero estaba llamando a RenderPartial() en una línea dentro de un bloque de código @ {}. – danjarvis

+4

Recomiendo ver la respuesta de ctorx a continuación. Agrega datos adicionales a ViewData existente. – raRaRa

8

Creo que esto debería funcionar no?

ViewData["currentIndex"] = index; 
+5

Si bien esta no es una forma muy sólida de hacerlo, sí me ayudó a encontrar la manera de recuperar un valor de datos de vista de la respuesta de Womp. –

5

Cree otra clase que contenga su clase fuertemente tipada.

Agregue sus cosas nuevas a la clase y devolverlas en la vista.

Luego, en la vista, asegúrese de heredar su nueva clase y cambie los bits de código que ahora estarán en error. a saber, las referencias a sus campos.

Espero que esto ayude. Si no, avíseme y publicaré un código específico.

4

La manera más fácil de pasar datos adicionales es agregar los datos a los ViewData existentes para la vista como señala @Joel Martinez. Sin embargo, si no quiere contaminar su ViewData, RenderPartial tiene un método que toma tres argumentos, así como la versión de dos argumentos que muestra. El tercer argumento es un ViewDataDictionary. Puede construir un ViewDataDictionary separado solo para su parcial que contiene solo los datos adicionales que desea pasar.

130

Extender en lo Womp publicado, que puede aprobar una nueva vista de datos, manteniendo la existente Ver datos si se utiliza la sobrecarga del constructor de la ViewDataDictionary así:

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

esto puede ser muy útil si necesita retener 'TemplateInfo.HtmlFieldPrefix' en el control secundario que de lo contrario se reiniciará –

+8

Esta es definitivamente la mejor solución. La pérdida de ViewData significa que usted pierde el ModelState y todas las validaciones. +1 –

+0

Esto parece funcionar solo si no pasa TemplateInfo.HtmlFieldPrefix en su ViewDataDictionary. Solo puedo pasar una variable como se muestra en la respuesta, o pasar un TemplateInfo.HtmlFieldPrefix, pero no ambos. – Ferox

32
@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" } });} 

parcial Página (_Header):

<div class="row titleBlock"> 
    <h1>@ViewData["HeaderName"].ToString()</h1> 
    <h5>@ViewData["TitleName"].ToString()</h5> 
</div> 
+2

Parece la respuesta más completa (aunque .ToString() no es necesario). – Colin

0

Puede usar la variable dinámica ViewBag

ViewBag.AnotherValue = valueToView; 
Cuestiones relacionadas