Передача анонимных объектов из вида в частичный вид
Я понимаю из различных других связанных с нами вопросов здесь и здесь, среди прочего, что вы не можете пройти анонимно набранные объекты из контроллера в представление, поскольку анонимные типы определяются с помощью внутреннего аксессора. Код View и Controller скомпилированы в разные сборки, поэтому попытка его использования приводит к этой ошибке...
Объект не содержит определения для 'foo'
Это прекрасно, и я могу согласиться с этим, хотя сначала это раздражало. Есть достаточно рекомендуемых обходных решений, чтобы успокоить меня.
Однако я думал, что вы все равно сможете передать анонимный тип из представления в частичный вид, потому что, будучи представлениями, они будут скомпилированы в одной сборке.
Razor Просмотреть код...
@Html.Partial("Partial1", new { foo = "Something", bar = "Something else" })
и код частичного просмотра для "Partial1"
@model dynamic
<h1>@Model.foo</h1>
<span>@Model.bar</span>
Странно, что этот WAS работает в начале разработки в новом проекте MVC, но поскольку я добавил больше просмотров, он просто перестал работать и теперь дал мне ту же ошибку, о которой я говорил выше.
Это как если бы я достиг порога, где вид и частичный вид больше не компилируются в одну и ту же сборку. Но я просто догадываюсь.
Интересно, может ли кто-нибудь пролить свет на это.
Ответы
Ответ 1
Подробнее см. в вопросе и моем ответе здесь:
Динамическая модель MVC Razor, 'object' не содержит определения для 'PropertyName'
По сути, наиболее вероятная причина, по которой она перестала работать, состоит в том, что у вас есть другое представление в той же папке с типом модели, который не разрешен.
Исправить нарушающий вид с разбитым типом модели, очистить и перестроить решение, и оно должно работать снова.
Ответ 2
Не знаю, почему он прекратил работать, но вот обходной путь.
Используйте @ViewData.Eval("foo")
вместо @Model.foo
и удалите динамическую строку @model. Это не нужно.
Ответ 3
Я никогда не мог объяснить, почему это работает, а затем остановилось, поэтому просто пришлось прибегать к использованию именных определений типов. Не конец света, а разочарование. Этот вид идеально подходит для использования динамических типов.