asp.net-mvc-3 - anotation - viewmodel asp net mvc 4
Modelo dinámico MVC Razor, ''objeto'' no contiene definición para ''PropertyName'' (7)
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 compilados 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 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 implicarí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 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 compila, los tipos anónimos no se verán afectados de la misma manera. Esto se debe a cómo Razor divide la compilació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 compilación en tiempo de compilación de sus vistas de Razor agregándolas a su archivo csproj
:
<PropertyGroup>
<MvcBuildViews>true</MvcBuildViews>
</PropertyGroup>
Usando MVC 3 con motor Razor view. 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 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 dinámico porque los tipos anónimos se compilan como internal
. Como la vista CSHTML se compila 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!
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<string, object> anonymousDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(anonymousObject);
IDictionary<string, object> 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 .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 here
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:
<div class="fb-comments" data-href="@ViewData.Eval("currentUrl")" data-numposts="@ViewData.Eval("commentCount")" data-width="100%"></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 sintaxis 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