Я получаю следующую ошибку:
'object' не содержит определения для RatingName
Когда вы смотрите на анонимный динамический тип, он явно имеет RatingName.
Я понимаю, что могу сделать это с помощью кортежа, но я хотел бы понять, почему появляется сообщение об ошибке.
dynamic
asp.net-mvc-3
razor
anonymous-types
JarrettV
источник
источник
Я нашел ответ в связанном вопросе . Ответ указан в сообщении Дэвида Эббо в блоге. Передача анонимных объектов в представления MVC и доступ к ним с помощью динамического
источник
Использование ToExpando метода является лучшим решением.
Вот версия, которая не требует сборки System.Web :
источник
Вместо того, чтобы создавать модель из анонимного типа, а затем пытаться преобразовать анонимный объект в
ExpandoObject
подобное:Вы можете просто создать
ExpandoObject
непосредственно:Затем, по вашему мнению, вы устанавливаете тип модели как динамический,
@model dynamic
и вы можете получить доступ к свойствам напрямую:Обычно я рекомендую строго типизированные модели представления для большинства представлений, но иногда такая гибкость удобна.
источник
Вы можете использовать импровизированный интерфейс Framework, чтобы обернуть анонимный тип в интерфейс.
Вы просто вернете
IEnumerable<IMadeUpInterface>
и в конце вашего Linq используйте.AllActLike<IMadeUpInterface>();
это работает, потому что он вызывает анонимное свойство, используя DLR с контекстом сборки, которая объявила анонимный тип.источник
Написал консольное приложение и добавил Mono.Cecil в качестве ссылки (теперь вы можете добавить его из NuGet ), затем напишите фрагмент кода:
Приведенный выше код получит файл сборки из входных аргументов и использует Mono.Cecil, чтобы изменить доступность с внутреннего на общедоступный, и это решит проблему.
Мы можем запустить программу в событии Post Build на сайте. Я написал в блоге об этом на китайском языке, но я верю, что вы можете просто прочитать код и снимки. :)
источник
Основываясь на принятом ответе, я переопределил в контроллере, чтобы он работал вообще и за кулисами.
Вот код:
Теперь вы можете просто передать анонимный объект в качестве модели, и он будет работать как положено.
источник
Я собираюсь сделать немного воровство с https://stackoverflow.com/a/7478600/37055
Если вы устанавливаете пакет- динамит, вы можете сделать это:
И крестьяне радуются.
источник
Причина RuntimeBinderException сработала, я думаю, что есть хороший ответ в других сообщениях. Я просто пытаюсь объяснить, как я на самом деле заставляю это работать.
По ссылке на ответ @DotNetWise и Binding view с коллекцией анонимных типов в ASP.NET MVC ,
Во-первых, создайте статический класс для расширения
В контроллере
В представлении @model IEnumerable (динамический, а не класс модели) это очень важно, так как мы собираемся связать объект анонимного типа.
Тип в foreach, у меня нет ошибок ни с помощью VAR, ни динамического .
Кстати, создание новой ViewModel, которая соответствует новым полям, также может быть способом передачи результата в представление.
источник
Теперь в рекурсивном аромате
источник
Использование ExpandoObject Extension работает, но прерывается при использовании вложенных анонимных объектов.
Такие как
Для этого я использую это.
Использование в контроллере такое же, за исключением того, что вы используете ToRazorDynamic () вместо ToExpando ().
По вашему мнению, чтобы получить весь анонимный объект, вы просто добавляете «.AnonValue» в конец.
источник
Я пробовал ExpandoObject, но он не работал с вложенным анонимным сложным типом, подобным этому:
Поэтому я решил вернуть модель JObject to View:
и преобразовать в динамический в .cshtml:
источник