2011-08-24 9 views
36

¿Hay alguna forma de pasar datos adicionales junto con un modelo a una vista parcial?MVC3 - Pasar datos más allá del modelo a la vista parcial

E.G.

@Html.Partial("_SomeTable", (List<CustomTable>)ViewBag.Table);

es lo que tengo ahora. ¿Puedo agregar algo más sin cambiar mi Modelo?

@Html.Partial("_SomeTable", (List<CustomTable>)ViewBag.Table, "TemporaryTable");

veo ViewDataDictionary como un parámetro. No estoy seguro de qué hace este objeto o si cumple con mi necesidad.

Respuesta

64

ViewDataDictionary se puede utilizar para reemplazar el diccionario ViewData en la vista parcial ... Si no pasa un parámetro ViewDataDictionary, los datos de vista del parial son los mismos que los padres.

Un ejemplo de cómo utilizarlo en los padres es:

@Html.Partial("_SomeTable", (List<CustomTable>)ViewBag.Table, new ViewDataDictionary {{ "Key", obj }}); 

Luego, dentro de lo parcial que se puede acceder a este obj de la siguiente manera:

@{ var obj = ViewData["key"]; } 

Un enfoque completamente diferente woud ser el uso de la clase Tuple para agrupar el modelo original y los datos adicionales juntos de la siguiente manera:

@Html.Partial("_SomeTable", Tuple.Create<List<CustomTable>, string>((List<CustomTable>)ViewBag.Table, "Extra data")); 

El tipo de modelo para el parcial sería entonces:

@model Tuple<List<CustomTable>, string> 

Model.Item1 da el objeto de lista y Model.Item2 da la cadena

+2

No puedo entender la sintaxis en 'nueva ViewDataDictionary {{ "clave", obj}} '. Donde están los paréntesis() en 'new ViewDataDictionary()' – Mahmoodvcs

+2

Son redundantes cuando tiene un inicializador de objetos ... que es lo que el código es directamente después de la nueva ViewDataDictionary .. vea http://msdn.microsoft.com/en -us/library/bb531208.aspx –

+1

'@ {var obj = ViewBag.Key; } 'también funciona para acceder a los datos pasados – MEC

7

Debería poder ponerlo en el ViewBag y luego acceder a él desde el ViewBag en la vista parcial. See this SO answer.

2

Se puede llegar incluso inteligente as shown here by Craig Stuntz

Html.RenderPartial("SomePartialView", null, 
    new ViewDataDictionary(new ViewDataDictionary() { {"SomeDisplayParameter", true }}) 
     { Model = MyModelObject }); 
5

I se encontró con este problema también. Quería tener un fragmento de código reproducido muchas veces, y no quería copiar pegar. El código podría variar ligeramente. Después de mirar las otras respuestas, no quería ir por esa ruta exacta y decidí usar simplemente un simple Dictionary.

Por ejemplo:

parent.cshtml

@{ 
var args = new Dictionary<string,string>(); 
args["redirectController"] = "Admin"; 
args["redirectAction"] = "User"; 
} 
@Html.Partial("_childPartial",args) 

_childPartial.cshtml

@model Dictionary<string,string> 
<div>@Model["redirectController"]</div> 
<div>@Model["redirectAction"]</div> 
Cuestiones relacionadas