Estou recebendo o seguinte erro:
'object' não contém uma definição para 'RatingName'
Quando você olha para o tipo dinâmico anônimo, ele claramente possui RatingName.
Sei que posso fazer isso com uma tupla, mas gostaria de entender por que a mensagem de erro ocorre.
dynamic
asp.net-mvc-3
razor
anonymous-types
JarrettV
fonte
fonte
Encontrei a resposta em uma pergunta relacionada . A resposta está especificada na postagem do blog de David Ebbo Passando objetos anônimos para visualizações do MVC e acessando-os usando dinâmica
fonte
Usar o método ToExpando é a melhor solução.
Aqui está a versão que não requer a montagem System.Web :
fonte
Em vez de criar um modelo a partir de um tipo anônimo e tentar converter o objeto anônimo para um
ExpandoObject
como este ...Você pode apenas criar o
ExpandoObject
diretamente:Em sua opinião, você define o tipo de modelo como dinâmico
@model dynamic
e pode acessar as propriedades diretamente:Normalmente, eu recomendaria modelos de visualização com tipos fortes para a maioria das visualizações, mas às vezes essa flexibilidade é útil.
fonte
Você pode usar a interface de improviso da estrutura para agrupar um tipo anônimo em uma interface.
Você retornaria um
IEnumerable<IMadeUpInterface>
e, no final do Linq, usará.AllActLike<IMadeUpInterface>();
isso porque chama a propriedade anônima usando o DLR com um contexto do assembly que declarou o tipo anônimo.fonte
Escreva um aplicativo de console e adicione Mono.Cecil como referência (agora você pode adicioná-lo no NuGet ) e depois escreva o trecho de código:
O código acima obteria o arquivo de montagem das entradas args e usaria o Mono.Cecil para alterar a acessibilidade de interna para pública, e isso resolveria o problema.
Podemos executar o programa no evento Post Build do site. Eu escrevi um post sobre isso em chinês, mas acredito que você pode apenas ler o código e os instantâneos. :)
fonte
Com base na resposta aceita, substituí o controlador para fazê-lo funcionar em geral e nos bastidores.
Aqui está o código:
Agora você pode simplesmente passar um objeto anônimo como modelo, e ele funcionará conforme o esperado.
fonte
Vou roubar um pouco de https://stackoverflow.com/a/7478600/37055
Se você instalar dinamicamente o pacote, poderá fazer o seguinte:
E os camponeses se alegram.
fonte
O motivo de RuntimeBinderException acionado, acho que tem uma boa resposta em outras postagens. Eu apenas me concentro em explicar como eu realmente faço isso funcionar.
Consulte as respostas às visualizações @DotNetWise e Binding com coleção de tipos anônimos no ASP.NET MVC ,
Em primeiro lugar, crie uma classe estática para extensão
No controlador
Em View, @model IEnumerable (dinâmico, não uma classe de modelo), isso é muito importante, pois vamos vincular o objeto de tipo anônimo.
O tipo no foreach, não tenho erro usando var ou dinâmico .
A propósito, criar um novo ViewModel que corresponda aos novos campos também pode ser o caminho para passar o resultado para a visualização.
fonte
Agora com sabor recursivo
fonte
O uso da extensão ExpandoObject funciona, mas é interrompido ao usar objetos anônimos aninhados.
Tal como
Para conseguir isso, eu uso isso.
O uso no controlador é o mesmo, exceto que você usa ToRazorDynamic () em vez de ToExpando ().
Na sua opinião, para obter todo o objeto anônimo, basta adicionar ".AnonValue" ao final.
fonte
Eu tentei o ExpandoObject, mas não funcionou com um tipo complexo anônimo aninhado como este:
Portanto, minha solução foi retornar um modelo JObject para View:
e converta para dinâmico em .cshtml:
fonte