Динамическая модель MVC Razor, «объект» не содержит определения для «PropertyName»,

Использование MVC 3 с движком просмотра Razor. У меня есть этот вид:

@model dynamic @{ var products = (List)Model.Products; var threshold = (int)(Model.Threshold ?? 1); var id = Guid.NewGuid().ToString(); } 

Он вызывается из другого представления, используя этот код:

 @Html.Partial("PartialViewName", new { Products = Model, Threshold = 5 }) 

В обоих представлениях, когда я отлаживаю их и смотрю «Модель», кажется, что он содержит правильный объект. Когда я выполняю код, я получаю сообщение об ошибке в строке «var products =»:

‘object’ не содержит определения для ‘Products’

Может кто-нибудь объяснить мне, почему я получаю эту ошибку? Опять же, когда я смотрю объект Model в режиме отладки, он выглядит правильно (имеет 2 свойства: Products and Threshold)

Вы передаете экземпляр анонимного classа в качестве модели представления? Я просто попробовал это (динамическая модель представления в CSHTML) и получил ту же ошибку, что и при использовании анонимного classа, но работал отлично, если я создал именованный class. Я искал, но не видел, чтобы это было зарегистрировано где угодно.

 // error return View(new { Foo = 1, Bar = "test" }); // worked return View(new TestClass { Foo = 1, Bar = "test" }); 

EDIT # 1:

Согласно Дэвиду Эббо , вы не можете передавать анонимный тип в динамически типизированное представление, потому что анонимные типы скомпилированы как internal . Поскольку представление CSHTML скомпилировано в отдельную сборку, оно не может получить доступ к свойствам анонимного типа.

РЕДАКТИРОВАТЬ № 2:

Дэвид Эббо редактировал свой пост с этим разъяснением:

Примечание (12/22/2011): теперь, когда MVC 3 имеет прямую поддержку динамического режима, техника, описанная ниже, больше не нужна. Это сообщение на самом деле привело к интеграции функции в MVC!

В .NET 4.0 Анонимные типы могут быть легко преобразованы в ExpandoObjects, и, следовательно, все проблемы исправлены с накладными расходами самого преобразования. Отъезд здесь

Это не имеет ничего общего с анонимными типами, имеющими внутренние свойства

Вполне возможно передавать анонимные типы из вида в частичный вид

Сегодня я столкнулся с такой же проблемой, и ничто (непосредственно) не связано с проблемой передачи анонимных типов и их внутренних internal свойств.

Таким образом, в связи с вопросом OP, ответ @Lucas не имеет значения – даже если обходной путь будет работать .

В вопросе OPs анонимный тип передается из представления в сборке X в частичное в сборке X , поэтому проблема, которую Дэвид Эббо изложил о свойствах, являющихся внутренними для анонимных типов, не имеет никакого значения; типы, скомпилированные для представления, частичный и анонимный типы содержатся в одной сборке .

Итак, что вызывает внезапный отказ от анонимного типа с точки зрения на частичный?

По крайней мере, в моей ситуации я обнаружил, что это связано с тем, что у SAME FOLDER есть другой вид, который указывает тип модели, который не может быть разрешен . Представления компилируются во время выполнения, поэтому было бы разумно, поскольку неудача во время выполнения компиляции представлений также означала бы невозможность скомпилировать динамические типы, а частичное просто получило бы object . Не сразу видно, что происходит, но в конкретном примере OP (и моем) это более чем вероятно причина проблемы.

Интересно отметить, что если тип модели верен, но другая часть представления не компилируется, то анонимные типы не затрагиваются одинаково. Это должно быть связано с тем, как Razor разбивает динамическую компиляцию составных частей представления.

После того как вы исправите нарушающий вид, либо перестройте все решение, либо очистите и перестройте проект, прежде чем проверять, исправлено ли это.

Чтобы убедиться, что вы этого не заметили, вы можете включить компиляцию компиляции ваших просмотров Razor, добавив это в свой файл csproj :

  true  

Добавьте следующий class в ваше решение (используйте пространство имен System, поэтому его можно использовать без необходимости добавлять ссылки) –

  namespace System { public static class ExpandoHelper { public static ExpandoObject ToExpando(this object anonymousObject) { IDictionary anonymousDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(anonymousObject); IDictionary expando = new ExpandoObject(); foreach (var item in anonymousDictionary) expando.Add(item); return (ExpandoObject)expando; } } } 

Когда вы отправляете модель в представление, преобразуйте ее в Expando:

  return View(new {x=4, y=6}.ToExpando()); 

Вместо использования dynamic типа модели в частичном представлении.

Вы можете вызвать атрибуты анонимного объекта, используя @ViewData.Eval("foo") вместо @Model.foo .

Затем вы можете удалить @Model dynamic из представления.

Недавно я столкнулся с этой проблемой, когда передавал некоторые атрибуты между представлениями для интеграции социальных комментариев Facebook. Пример кода:

 Html.RenderPartial(@"Layouts/Partials/_Comments", new {currentUrl = Model.CurrentPage.GetAbsoluteUrl(), commentCount = 5 }); 

Тогда, на мой взгляд, у меня был только этот div:

 

Я не уверен, что вы получаете эту ошибку, потому что не выполняете обход. Я получил ту же ошибку в частичном представлении. решение было просто очистить сборку и перестроить ее. если синтаксис верен, код должен работать, но механизм бритвы может не корректировать изменения кода должным образом.

Чтобы использовать dynamic тип, вам необходимо обратиться к сборке Microsoft.CSharp

  • Как ссылаться на .css-файл на бритву?
  • Razor: @ Html.Partial () vs @RenderPage ()
  • Загрузка файла MVC 3 и привязка к модели
  • Преобразование байт-массива в изображение и отображение в режиме просмотра бритвы
  • Razor Views не видит System.Web.Mvc.HtmlHelper
  • Ненавязчивая проверка не работает с частичным представлением с динамическим добавлением
  • Как импортировать пространство имен на странице просмотра Razor?
  • Дата проверки валидации продолжается
  • MVC, кнопка отправки которого нажата
  • Razor / CSHTML - Любая польза от того, что у нас есть?
  • Замените символы разрыва строки с помощью в представлении ASP.NET MVC Razor
  • Давайте будем гением компьютера.