Modelo dynamic MVC Razor, ‘objeto’ no contiene definición para ‘PropertyName’

Usando MVC 3 con motor Razor view. Tengo esta vista:

@model dynamic @{ var products = (List)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 miro 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 para ‘Productos’

¿Alguien puede explicarme por qué me da ese error? De nuevo, cuando miro el objeto Model en modo de depuración, se ve bien (tiene 2 propiedades: Productos y Umbral)

¿Estás 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 cuando usaba una clase anónima, pero funcionó bien si creé una clase con nombre. Busqué pero no he visto esto documentado en ninguna parte.

 // error return View(new { Foo = 1, Bar = "test" }); // worked return View(new TestClass { Foo = 1, Bar = "test" }); 

EDIT # 1:

Según David Ebbo , no se puede pasar un tipo anónimo a una vista de tipo dynamic porque los tipos anónimos se comstackn como internal . Como la vista CSHTML se comstack en un ensamblaje separado, no puede acceder a las propiedades del tipo anónimo.

EDIT # 2:

David Ebbo ha editado su publicación con esta aclaración:

Nota (22/12/2011): ahora que MVC 3 tiene soporte directo para dinámica, la técnica a continuación ya no es necesaria. ¡Esta publicación es, de hecho, lo que llevó a integrar la función en MVC!

En .NET 4.0, los tipos anónimos se pueden convertir fácilmente a ExpandoObjects y, por lo tanto, todos los problemas se solucionan con la sobrecarga de la conversión. Mira aquí

Esto no tiene nada que ver con los tipos anónimos que tienen propiedades internas

Es perfectamente posible pasar tipos anónimos desde una vista a una vista parcial

Encontré el mismo problema hoy y no fue nada (directamente) relacionado con el problema de pasar tipos anónimos y sus propiedades internal inherentes.

Como tal, en relación con la pregunta de OP, la respuesta de @Lucas es irrelevante, incluso aunque la solución funcione .

En la pregunta de OP, se pasa un tipo anónimo desde una vista en el conjunto X a un parcial en el conjunto X , por lo tanto, el problema que David Ebbo describió de las propiedades que son internas para los tipos anónimos no tiene importancia; los tipos comstackdos para la vista, el tipo parcial y el anónimo están todos contenidos en el mismo ensamblaje .

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 comstackn en tiempo de ejecución, por lo que tendría sentido ya que una falla en el tiempo de ejecución para comstackr las vistas también implicaría una falla al comstackr los tipos dynamics 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 el mío) es más que probable la causa del problema.

Es interesante observar que si el tipo de modelo es correcto pero otra parte de la vista no se comstack, los tipos anónimos no se verán afectados de la misma manera. Esto se debe a cómo Razor divide la comstackción dinámica de las partes componentes de la vista.

Una vez que corrija la vista ofensiva, reconstruya toda la solución o limpie y vuelva a generar el proyecto antes de verificar si está solucionado.

Para asegurarse de que no lo csproj nuevamente, puede habilitar la comstackción en tiempo de comstackción de sus vistas de Razor agregándolas a su archivo csproj :

  true  

Agregue la siguiente clase en cualquier lugar de su solución (use el espacio de nombres del sistema, por lo que está listo para usar sin tener que agregar ninguna referencia) –

  namespace System { public static class ExpandoHelper { public static ExpandoObject ToExpando(this object anonymousObject) { IDictionary anonymousDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(anonymousObject); IDictionary expando = new ExpandoObject(); foreach (var item in anonymousDictionary) expando.Add(item); return (ExpandoObject)expando; } } } 

Cuando envíe el modelo a la vista, conviértalo a Expando:

  return View(new {x=4, y=6}.ToExpando()); 

En lugar de usar el tipo de Modelo dynamic dentro de la vista parcial.

Puede llamar a los atributos de objeto anónimos usando @ViewData.Eval("foo") lugar de @Model.foo .

Luego puede eliminar @Model dynamic de la vista.

Me encontré con este problema recientemente al pasar algunos atributos entre las vistas para la Integración de Comentarios Sociales de Facebook. Código de ejemplo:

 Html.RenderPartial(@"Layouts/Partials/_Comments", new {currentUrl = Model.CurrentPage.GetAbsoluteUrl(), commentCount = 5 }); 

Entonces, en mi opinión, acabo de tener este div:

 

No estoy seguro de que esté recibiendo este error porque no está implementando la solución alternativa. Tengo el mismo error en una vista parcial. la solución fue solo limpiar la construcción y reconstruirla. si la syntax es correcta, el código debería funcionar, pero es posible que la máquina de afeitar no esté actualizando correctamente el código.

Para utilizar dynamic tipo dynamic , debe hacer referencia al ensamblado Microsoft.CSharp