Usando MVC 3 com motor de visualização Razor. Eu tenho esta visão:
@model dynamic
@{
var products = (List<ListItemBaseModel>)Model.Products;
var threshold = (int)(Model.Threshold ?? 1);
var id = Guid.NewGuid().ToString();
}
Ele é chamado de outra visualização usando este código:
@Html.Partial("PartialViewName", new { Products = Model, Threshold = 5 })
Em ambas as visualizações, quando eu os depuro e observo o modelo, ele parece conter o objeto correto. Quando executo o código, obtenho um erro na linha "var products =" que diz:
'objeto' não contém uma definição para 'Produtos'
Alguém pode me explicar por que recebo esse erro? Mais uma vez, quando vejo o objeto Model no modo de depuração, parece que está tudo bem (tendo 2 propriedades: Produtos e Limite)
asp.net-mvc-3
razor
Ruud van Falier
fonte
fonte
Respostas:
Você está passando uma instância de uma classe anônima como o modelo de exibição? Eu apenas tentei isso (modelo de visão dinâmica em CSHTML) e recebi o mesmo erro que você ao usar uma classe anônima, mas funcionou bem se eu criasse uma classe nomeada. Eu procurei, mas não vi isso documentado em nenhum lugar.
EDITAR # 1:
De acordo com David Ebbo , você não pode passar um tipo anônimo para uma visão digitada dinamicamente porque os tipos anônimos são compilados como
internal
. Visto que a visualização CSHTML é compilada em um assembly separado, ela não pode acessar as propriedades do tipo anônimo.EDITAR # 2:
David Ebbo editou sua postagem com este esclarecimento:
fonte
return View(new { Foo = 1, Bar = "test" });
? Porque estou usando MVC 4 e ainda estou obtendo "objeto não contém uma definição para Foo"ToExpando
daquele)No .NET 4.0, os tipos anônimos podem ser facilmente convertidos em ExpandoObjects e, portanto, todos os problemas são corrigidos com a sobrecarga da própria conversão. Confira aqui
fonte
Isso não tem nada a ver com tipos anônimos com propriedades internas
É perfeitamente possível passar tipos anônimos de uma visão para uma visão parcial
Eu encontrei o mesmo problema hoje e não tinha nada (diretamente) a ver com o problema de passar tipos anônimos e suas
internal
propriedades inerentes .Assim, em relação à pergunta dos POs, a resposta de @Lucas é irrelevante - embora a solução alternativa funcione .
Na questão de OPs, um tipo anônimo está sendo passado de uma visão no assembly X para um parcial no assembly X , portanto, o problema que David Ebbo descreveu das propriedades sendo internas para tipos anônimos não tem consequência; os tipos compilados para a visão, o tipo parcial e o tipo anônimo estão todos contidos no mesmo assembly .
Então, o que está causando a falha repentina de passar um tipo anônimo de uma exibição para uma parcial?
Pelo menos na minha situação, descobri que era devido a ter outra visualização na MESMA PASTA que especifica um tipo de modelo que não pode ser resolvido . As visualizações são compiladas em tempo de execução e, portanto, faria sentido, uma vez que uma falha em tempo de execução para compilar as visualizações também significaria uma falha ao compilar os tipos dinâmicos e o parcial simplesmente receberia um
object
. Não é imediatamente óbvio o que está acontecendo, mas no exemplo específico de OPs (e no meu) essa é a causa mais provável do problema.É interessante notar que se o tipo de modelo estiver correto, mas outra parte da visualização não compilar, os tipos anônimos não serão afetados da mesma maneira. Isso deve ser explicado como o Razor divide a compilação dinâmica das partes componentes da visualização.
Depois de corrigir a visão ofensiva, reconstrua toda a solução ou limpe e reconstrua o projeto antes de verificar se foi corrigido.
Para garantir que você não seja pego por isso novamente, você pode habilitar a compilação em tempo de compilação de suas visualizações do Razor adicionando isto ao seu
csproj
arquivo:fonte
Adicione a seguinte classe em qualquer lugar em sua solução (use o namespace System, então está pronto para usar sem ter que adicionar nenhuma referência) -
Ao enviar o modelo para a visualização, converta-o para Expando:
fonte
Em vez de usar o
dynamic
tipo de modelo na vista parcial.Você pode chamar os atributos do objeto anônimo usando em
@ViewData.Eval("foo")
vez de@Model.foo
.Em seguida, você pode remover
@Model dynamic
da vista.Eu me deparei com esse problema recentemente ao passar alguns atributos entre visualizações para a integração de comentários sociais do Facebook. Código de exemplo:
Então, na minha opinião, eu tinha apenas este div:
fonte
Não tenho certeza se você está recebendo esse erro porque não está implementando a solução alternativa. eu tenho o mesmo erro em uma visão parcial. a solução era apenas limpar a construção e reconstruí-la. se a sintaxe estiver correta, o código deve funcionar, mas o mecanismo de barbear pode não estar atualizando as alterações de código corretamente.
fonte
Eu contornei esse problema usando um Dicionário.
fonte
Para usar o
dynamic
tipo, você precisa fazer referência aoMicrosoft.CSharp
assemblyfonte