Использование MVC 3 с механизмом просмотра Razor. У меня такой вид:
@model dynamic
@{
var products = (List<ListItemBaseModel>)Model.Products;
var threshold = (int)(Model.Threshold ?? 1);
var id = Guid.NewGuid().ToString();
}
Он вызывается из другого представления с использованием этого кода:
@Html.Partial("PartialViewName", new { Products = Model, Threshold = 5 })
В обоих представлениях, когда я их отлаживаю и смотрю модель, кажется, что он содержит правильный объект. Когда я выполняю код, я получаю сообщение об ошибке в строке "var products =":
'объект' не содержит определения для 'продуктов'
Может ли кто-нибудь объяснить мне, почему я получаю эту ошибку? Опять же, когда я смотрю объект Model в режиме отладки, он выглядит нормально (имеет 2 свойства: Products и Threshold).
asp.net-mvc-3
razor
Рууд ван Фалиер
источник
источник
Ответы:
Вы передаете экземпляр анонимного класса в качестве модели представления? Я просто попробовал это (модель динамического представления в CSHTML) и получил ту же ошибку, что и ваша, при использовании анонимного класса, но он работал нормально, если я создал именованный класс. Я искал, но нигде не видел этого документированного.
РЕДАКТИРОВАТЬ №1:
По словам Дэвида Эббо , вы не можете передать анонимный тип в динамически типизированное представление, потому что анонимные типы компилируются как
internal
. Поскольку представление CSHTML скомпилировано в отдельную сборку, оно не может получить доступ к свойствам анонимного типа.РЕДАКТИРОВАТЬ № 2:
Дэвид Эббо отредактировал свой пост следующим образом:
источник
return View(new { Foo = 1, Bar = "test" });
? Потому что я использую MVC 4 и все еще получаю «объект не содержит определения для Foo»ToExpando
одним)В .NET 4.0 анонимные типы можно легко преобразовать в ExpandoObjects, и, таким образом, все проблемы устраняются за счет накладных расходов на само преобразование. Проверить здесь
источник
Это не имеет ничего общего с анонимными типами, имеющими внутренние свойства.
Вполне возможно передать анонимные типы из представления в частичное представление
Сегодня я столкнулся с той же проблемой, и она не имела (напрямую) ничего общего с проблемой передачи анонимных типов и присущих им
internal
свойств.Таким образом, в отношении вопроса OP, ответ @Lucas не имеет значения - даже если обходной путь будет работать .
В вопросе OP анонимный тип передается из представления в сборке X в партиал в сборке X , поэтому проблема, которую обозначил Дэвид Эббо о внутренних свойствах анонимных типов, не имеет значения; типы, скомпилированные для представления, частичный и анонимный тип - все содержатся в одной сборке .
Так что же вызывает внезапную неудачу в передаче анонимного типа из представления в частичное?
По крайней мере, в моей ситуации я обнаружил, что это произошло из-за наличия другого представления в ТАКОЙ ПАПКЕ, которое указывает тип модели, который не может быть разрешен . Представления компилируются во время выполнения, и поэтому это имело бы смысл, поскольку сбой во время выполнения компиляции представлений также означал бы сбой при компиляции динамических типов, и партиал просто получил бы файл
object
. Не сразу очевидно, что происходит, но в конкретном примере OP (и моем) это более чем вероятно является причиной проблемы.Интересно отметить, что если тип модели правильный, но другая часть представления не компилируется, анонимные типы не затрагиваются таким же образом. Это должно быть связано с тем, как Razor разбивает динамическую компиляцию составных частей представления.
После исправления неправильного представления либо перестройте все решение, либо очистите и перестройте проект, прежде чем проверять, исправлено ли оно.
Чтобы убедиться, что вас это снова не поймает, вы можете включить компиляцию ваших представлений Razor во время компиляции, добавив это в свой
csproj
файл:источник
Добавьте следующий класс в любое место вашего решения (используйте пространство имен System, чтобы его можно было использовать без добавления каких-либо ссылок) -
Когда вы отправляете модель на вид, конвертируйте ее в Expando:
источник
Вместо использования
dynamic
типа модели в частичном представлении.Вы можете вызывать атрибуты анонимного объекта, используя
@ViewData.Eval("foo")
вместо@Model.foo
.Потом можно убрать
@Model dynamic
из поля зрения.Я недавно столкнулся с этой проблемой при передаче некоторых атрибутов между представлениями для интеграции комментариев в социальных сетях Facebook. Пример кода:
Тогда, на мой взгляд, у меня был только этот div:
источник
Я не уверен, что вы получаете эту ошибку, потому что вы не реализуете обходной путь. у меня такая же ошибка при частичном просмотре. решение заключалось в том, чтобы просто очистить сборку и перестроить ее. если синтаксис правильный, код должен работать, но движок бритвы может неправильно обновлять изменения кода.
источник
Я решил эту проблему с помощью словаря.
источник
Чтобы использовать
dynamic
тип, вам необходимо указатьMicrosoft.CSharp
сборкуисточник