Recibo el siguiente error:
'objeto' no contiene una definición para 'RatingName'
Cuando observa el tipo dinámico anónimo, claramente tiene RatingName.
Me doy cuenta de que puedo hacer esto con una Tupla, pero me gustaría entender por qué aparece el mensaje de error.
dynamic
asp.net-mvc-3
razor
anonymous-types
JarrettV
fuente
fuente
Encontré la respuesta en una pregunta relacionada . La respuesta se especifica en la publicación del blog de David Ebbo. Pasar objetos anónimos a vistas de MVC y acceder a ellos utilizando dinámicas.
fuente
Usar el método ToExpando es la mejor solución.
Aquí está la versión que no requiere el ensamblaje de System.Web :
fuente
En lugar de crear un modelo a partir de un tipo anónimo y luego tratar de convertir el objeto anónimo en algo
ExpandoObject
así ...Simplemente puede crear el
ExpandoObject
directamente:Luego, en su vista, establece el tipo de modelo como dinámico
@model dynamic
y puede acceder a las propiedades directamente:Normalmente recomendaría modelos de vista fuertemente tipados para la mayoría de las vistas, pero a veces esta flexibilidad es útil.
fuente
Puede usar la interfaz improvisada de framework para envolver un tipo anónimo en una interfaz.
Simplemente devolvería un
IEnumerable<IMadeUpInterface>
y al final de su uso de Linq.AllActLike<IMadeUpInterface>();
esto funciona porque llama a la propiedad anónima usando el DLR con un contexto del ensamblado que declaró el tipo anónimo.fuente
Escribió una aplicación de consola y agregue Mono.Cecil como referencia (ahora puede agregarlo desde NuGet ), luego escriba el fragmento de código:
El código anterior obtendría el archivo de ensamblaje de los argumentos de entrada y usaría Mono.Cecil para cambiar la accesibilidad de interna a pública, y eso resolvería el problema.
Podemos ejecutar el programa en el evento Post Build del sitio web. Escribí una publicación de blog sobre esto en chino, pero creo que puedes leer el código y las instantáneas. :)
fuente
Basado en la respuesta aceptada, he anulado en el controlador para que funcione en general y detrás de escena.
Aquí está el código:
Ahora puede pasar un objeto anónimo como modelo y funcionará como se espera.
fuente
Voy a robar un poco de https://stackoverflow.com/a/7478600/37055
Si instala dynamitey de paquete , puede hacer esto:
Y los campesinos se regocijan.
fuente
La razón de la activación de RuntimeBinderException, creo que hay una buena respuesta en otras publicaciones. Solo me concentro en explicar cómo lo hago funcionar.
Por referirse a responder @DotNetWise y encuadernación con vistas colección de tipo anónimo en ASP.NET MVC ,
En primer lugar, crear una clase estática para extensión
En el controlador
En View, @model IEnumerable (dinámico, no una clase de modelo), esto es muy importante ya que vamos a vincular el objeto de tipo anónimo.
El tipo en foreach, no tengo ningún error, ya sea usando var o dynamic .
Por cierto, crear un nuevo ViewModel que coincida con los nuevos campos también puede ser la forma de pasar el resultado a la vista.
fuente
Ahora en sabor recursivo
fuente
Usar la extensión ExpandoObject funciona pero se rompe cuando se usan objetos anónimos anidados.
Como
Para lograr esto, uso esto.
El uso en el controlador es el mismo, excepto que usa ToRazorDynamic () en lugar de ToExpando ().
En su vista para obtener el objeto anónimo completo, simplemente agregue ".AnonValue" al final.
fuente
Probé el ExpandoObject pero no funcionó con un tipo complejo anónimo anidado como este:
Entonces, mi solución fue devolver un modelo JObject to View:
y convertir a dinámico en .cshtml:
fuente