vistas vista que parciales parcial pagina net mvc multiples misma cargar asp asp.net-mvc razor partial-views anonymous-types

asp.net-mvc - vista - razor partial



Pasar objetos anĂ³nimos de una vista a una vista parcial (4)

Entiendo por varias otras preguntas relacionadas here y here entre otras, que no se pueden pasar objetos escritos de forma anónima desde el controlador a la vista porque los tipos anónimos se definen con el acceso interno. El código de la Vista y el Controlador se compilan en diferentes ensamblajes, por lo que al intentar usarlo se produce este error ...

objeto no contiene una definición para ''foo''

Eso está bien y puedo aceptarlo, aunque fue molesto al principio. Hay suficientes soluciones sugeridas para apaciguarme.

Sin embargo, pensé que todavía podría pasar un tipo anónimo de una vista a una vista parcial porque, al ser ambas vistas, se compilarían en el mismo ensamblaje.

Razor Ver código ...

@Html.Partial("Partial1", new { foo = "Something", bar = "Something else" })

y el código de vista parcial para "Partial1"

@model dynamic <h1>@Model.foo</h1> <span>@Model.bar</span>

Lo extraño es que esto estaba funcionando al comienzo del desarrollo de un nuevo proyecto MVC, pero a medida que agregué más vistas, simplemente dejó de funcionar y ahora me da el mismo error que mencioné anteriormente.

Es como si hubiera alcanzado un umbral donde la vista y la vista parcial ya no se compilan en el mismo ensamblaje. Pero solo estoy adivinando.

Me pregunto si alguien puede arrojar algo de luz sobre esto.


En ASP.NET Core, puede llamar a la vista parcial con un ayudante de etiqueta de vista parcial:

<partial name="MyPartialView" model=''new { SomeProperty = "some value" }'' />

luego, en la vista parcial, simplemente omita la directiva @Model y, por supuesto, su Model simplemente aparecerá. Entonces, en la vista parcial, puedes hacer algo como esto:

@{ var someProperty = Model.SomeProperty; }


No sé la razón por la que dejó de funcionar, pero aquí está la solución.

Use @ViewData.Eval("foo") lugar de @Model.foo

y elimina tu línea dinámica @model. No hay necesidad de ello.


Nunca pude explicar por qué esto funcionaba y luego se detuvo, así que simplemente tuve que recurrir al uso de definiciones de tipos con nombre. No es el fin del mundo sino decepcionante. Este tipo de cosas se adapta perfectamente al uso de tipos dinámicos.