Otrzymuję następujący błąd:
„obiekt” nie zawiera definicji dla „RatingName”
Kiedy patrzysz na anonimowy typ dynamiczny, wyraźnie ma on RatingName.
Zdaję sobie sprawę, że mogę to zrobić za pomocą krotki, ale chciałbym zrozumieć, dlaczego pojawia się komunikat o błędzie.
dynamic
asp.net-mvc-3
razor
anonymous-types
JarrettV
źródło
źródło
Znalazłem odpowiedź w pokrewnym pytaniu . Odpowiedź znajduje się w poście na blogu Davida Ebbo. Przekazywanie anonimowych obiektów do widoków MVC i uzyskiwanie do nich dostępu przy użyciu dynamiki
źródło
Korzystanie ToExpando metoda jest najlepszym rozwiązaniem.
Oto wersja, która nie wymaga montażu System.Web :
źródło
Zamiast tworzyć model z anonimowego typu, a następnie próbować przekonwertować anonimowy obiekt na
ExpandoObject
podobny ...Możesz po prostu utworzyć
ExpandoObject
bezpośrednio:Następnie w swoim widoku ustawiasz typ modelu jako dynamiczny
@model dynamic
i masz bezpośredni dostęp do właściwości:Zwykle zalecam silnie wpisane modele widoków dla większości widoków, ale czasami ta elastyczność jest przydatna.
źródło
Możesz użyć impromptu frameworka do zawijania anonimowego typu w interfejsie.
Po prostu zwróciłbyś
IEnumerable<IMadeUpInterface>
i na końcu swojego Linq użyj.AllActLike<IMadeUpInterface>();
tego, co działa, ponieważ wywołuje anonimową właściwość przy użyciu DLR z kontekstem zestawu, który zadeklarował typ anonimowy.źródło
Napisałem aplikację konsolową i dodaj Mono.Cecil jako odniesienie (możesz teraz dodać go z NuGet ), a następnie napisz fragment kodu:
Powyższy kod pobierze plik zestawu z argumentów wejściowych i użyje Mono.Cecil do zmiany dostępności z wewnętrznej na publiczną, a to rozwiązałoby problem.
Program możemy uruchomić w ramach wydarzenia Post Build witryny. Napisałem o tym post na blogu po chińsku, ale wydaje mi się, że możesz po prostu przeczytać kod i migawki. :)
źródło
W oparciu o zaakceptowaną odpowiedź zastąpiłem w kontrolerze, aby działał ogólnie i za kulisami.
Oto kod:
Teraz możesz po prostu przekazać anonimowy obiekt jako model i będzie działać zgodnie z oczekiwaniami.
źródło
Zamierzam trochę ukraść z https://stackoverflow.com/a/7478600/37055
Jeśli zainstalujesz pakiet dynamitey, możesz to zrobić:
A chłopi się cieszą.
źródło
Powód uruchomienia RuntimeBinderException, myślę, że w innych postach jest dobra odpowiedź. Skupiam się tylko na wyjaśnieniu, jak to właściwie działa.
Odwołaj się do odpowiedzi @DotNetWise i widoków Binding z kolekcją typu Anonymous w ASP.NET MVC ,
Po pierwsze, utwórz klasę statyczną do rozszerzenia
W kontrolerze
W widoku @model IEnumerable (dynamiczny, a nie klasa modelu) jest to bardzo ważne, ponieważ zamierzamy powiązać obiekt typu anonimowego.
Typ w foreach, nie mam błędu ani przy użyciu var ani dynamic .
Nawiasem mówiąc, utwórz nowy ViewModel, który jest zgodny z nowymi polami, może być również sposobem przekazania wyniku do widoku.
źródło
Teraz w stylu rekurencyjnym
źródło
Korzystanie z rozszerzenia ExpandoObject działa, ale nie działa, gdy używane są zagnieżdżone obiekty anonimowe.
Jak na przykład
Aby to osiągnąć, używam tego.
Użycie w kontrolerze jest takie samo, z wyjątkiem użycia ToRazorDynamic () zamiast ToExpando ().
Aby uzyskać cały anonimowy obiekt, po prostu dodaj na końcu „.AnonValue”.
źródło
Wypróbowałem ExpandoObject, ale nie działało to z zagnieżdżonym anonimowym typem złożonym, takim jak ten:
Więc moim rozwiązaniem było zwrócenie modelu JObject do View:
i przekonwertuj na dynamiczny w .cshtml:
źródło