Usando MVC 3 con el motor de vista de Razor. Tengo esta vista:
@model dynamic
@{
var products = (List<ListItemBaseModel>)Model.Products;
var threshold = (int)(Model.Threshold ?? 1);
var id = Guid.NewGuid().ToString();
}
Se llama desde otra vista usando este código:
@Html.Partial("PartialViewName", new { Products = Model, Threshold = 5 })
En ambas vistas, cuando las depuro y veo Model, parece contener el objeto correcto. Cuando ejecuto el código, aparece un error en la línea "var products =" que dice:
'objeto' no contiene una definición de 'Productos'
¿Alguien puede explicarme por qué recibo ese error? Nuevamente, cuando miro el objeto Modelo en modo de depuración, se ve bien (tiene 2 propiedades: Productos y Umbral)
asp.net-mvc-3
razor
Ruud van Falier
fuente
fuente
Respuestas:
¿Está pasando una instancia de una clase anónima como modelo de vista? Acabo de probar esto (modelo de vista dinámica en CSHTML) y obtuve el mismo error que el suyo al usar una clase anónima, pero funcionó bien si creé una clase con nombre. Busqué pero no he visto esto documentado en ninguna parte.
EDITAR # 1:
Según David Ebbo , no se puede pasar un tipo anónimo a una vista de tipo dinámico porque los tipos anónimos se compilan como
internal
. Dado que la vista CSHTML se compila en un ensamblado separado, no puede acceder a las propiedades del tipo anónimo.EDITAR # 2:
David Ebbo ha editado su publicación con esta aclaración:
fuente
return View(new { Foo = 1, Bar = "test" });
? Porque estoy usando MVC 4 y sigo obteniendo "el objeto no contiene una definición para Foo"ToExpando
uno)En .NET 4.0, los tipos anónimos se pueden convertir fácilmente en ExpandoObjects y, por lo tanto, todos los problemas se solucionan con la sobrecarga de la conversión en sí. Mira aquí
fuente
Esto no tiene nada que ver con los tipos anónimos que tienen propiedades internas.
Es perfectamente posible pasar tipos anónimos de una vista a una vista parcial
Hoy encontré el mismo problema y no tenía nada que ver (directamente) con el problema de pasar tipos anónimos y sus
internal
propiedades inherentes .Como tal, en relación con la pregunta de los PO, la respuesta de @Lucas es irrelevante, aunque la solución funcionará .
En la pregunta de OP, se pasa un tipo anónimo de una vista en el ensamblaje X a un parcial en el ensamblaje X , por lo tanto, el problema que David Ebbo describió de que las propiedades son internas para los tipos anónimos no tiene importancia; los tipos compilados para la vista, el tipo parcial y el anónimo están todos contenidos en el mismo ensamblado .
Entonces, ¿qué está causando la falla repentina de pasar un tipo anónimo de una vista a una parcial?
Al menos en mi situación, descubrí que se debía a tener otra vista en la MISMA CARPETA que especifica un tipo de modelo que no se puede resolver . Las vistas se compilan en tiempo de ejecución, por lo que tendría sentido, ya que una falla en el tiempo de ejecución para compilar las vistas también significaría una falla al compilar los tipos dinámicos y el parcial simplemente recibiría un
object
. No es inmediatamente obvio lo que está sucediendo, pero en el ejemplo específico de OP (y en el mío), esta es más que probable la causa del problema.Es interesante notar que si el tipo de modelo es correcto pero otra parte de la vista no se compila, los tipos anónimos no se ven afectados de la misma manera. Esto debe depender de cómo Razor divide la compilación dinámica de los componentes de la vista.
Una vez que corrija la vista ofensiva, reconstruya la solución completa o limpie y reconstruya el proyecto antes de verificar si está arreglado.
Para asegurarse de que esto no lo atrape nuevamente, puede habilitar la compilación en tiempo de compilación de sus vistas de Razor agregando esto a su
csproj
archivo:fuente
Agregue la siguiente clase en cualquier lugar de su solución (use el espacio de nombres del sistema, para que esté listo para usar sin tener que agregar ninguna referencia):
Cuando envíe el modelo a la vista, conviértalo a Expando:
fuente
En lugar de utilizar el
dynamic
tipo de modelo dentro de la vista parcial.Puede llamar a los atributos del objeto anónimo utilizando en
@ViewData.Eval("foo")
lugar de@Model.foo
.Entonces puedes eliminarlo
@Model dynamic
de la vista.Me encontré con este problema recientemente al pasar algunos atributos entre vistas para la integración de comentarios sociales de Facebook. Código de ejemplo:
Entonces, en mi opinión, acabo de tener este div:
fuente
No estoy seguro de que reciba este error porque no está implementando la solución alternativa. obtuve el mismo error en una vista parcial. la solución fue simplemente limpiar la construcción y reconstruirla. si la sintaxis es correcta, el código debería funcionar, pero es posible que el motor de la maquinilla de afeitar no esté actualizando los cambios de código correctamente.
fuente
Resolví este problema usando un diccionario.
fuente
Para usar el
dynamic
tipo, necesita hacer referencia alMicrosoft.CSharp
ensamblajefuente