Просто глядя на это, я думаю, что следующая строка является проблемой:
<ViewData Model="Region" />
Вместо этого следует читать:
<viewata model="Region" />
Обратите внимание на строчную "модель". Это потому, что model
является особым случаем, поскольку за сценой он выполняет приведение к строго типизированной модели представления. Верхний определит переменную с именем Model
в сгенерированном классе представления и присвоит ему значение Region
. Использование нижнего регистра ниже создаст переменную Model
, но также приведёт ее к строго типизированному экземпляру Region
, который взят из словаря ViewData
.
Примечание При использовании Model
в коде, как и в цикле for each
, он должен быть в верхнем регистре, что правильно в вашем случае. Еще раз, это единственный особый случай, потому что он извлекает строго типизированную модель из словаря ViewData
.
Еще одна вещь - <viewata model="Region" />
должна быть объявлена в родительском представлении, и она может быть определена только один раз для каждой страницы, поэтому вы не можете переопределить ее в частичном представлении. Если это частичное представление, вам лучше использовать его, передавая часть модели, как вы делали во втором примере выше.
Причина вашего исключения выше заключается в том, что он пытается получить свойство Id
в качестве статического элемента из Region
Типа вместо того, чтобы запрашивать свойство Id
в вашем экземпляр из Region
как часть вашей модели представления.
В качестве примечания, код для того, чтобы добраться туда, куда вы хотите, немного искажен. Вы можете найти более точные способы сделать то, что вы хотите, проверив некоторые из примеров прямого использования , но я понимаю, что это, вероятно, просто всплеск, чтобы увидеть, как это работает ...:)
Обновление в ответ на ваш ответ на вопрос / ответ
Я вполне уверен, что проблема заключается в передаче Region
в следующий вызов:
<ActiveTranslationRegion Region="region" if="region.Active==true">
... снова до именования. Да, у вас может быть только один model
на просмотр, как я уже говорил ранее, поэтому вам нужно удалить из верхней части вашей части следующее:
<viewdata model="Region" />
Вот что вызывает проблему. Затем я бы переименовал элемент, входящий в вашу частичку, примерно так:
<ActiveTranslationRegion ActiveRegion="region" if="region.Active==true">
и тогда ваш частичный будет выглядеть так:
<form action="/Translation/DeactivateRegion" class="ui-widget-content active-translation-region-widget">
<input type="hidden" name="Id" value="${ActiveRegion.Id}" />
<label class="region-name">${ ActiveRegion.RegionName }</label>
<input class="deactivate-region-button" type="image" src=${Url.Content("~/Content/Images/Deactivate.png")} alt="Deactivate" />
</form>
Примечание Я использую ActiveRegion
, потому что в синтаксическом анализаторе Spark ActiveRegion
объявляется как переменная и присваивается значение region
в текущей области видимости при циклическом просмотре for loop
. Нет необходимости неукоснительно придерживаться model
- потому что вы прошли и передали часть model
теперь, когда вы объявили как ActiveRegion
. О, и вы могли бы придерживаться имени Region
, если вы действительно хотите, я просто изменил его, чтобы подчеркнуть, и потому что у вас есть Type
с именем Region
в вашем коде, и я не большой Поклонник изворотливых проблем, использующих то же имя для переменной, что и тип. Плюс это делает это немного яснее.
Недостаток вызова метода Html.RenderPartial не сразу очевиден. Одна вещь, которую вы теряете, это 3-проходный рендеринг, который обеспечивает Spark. Если вы используете синтаксис тега (который является предпочтительным), вы сможете размещать партиалы внутри партиалов на нескольких уровнях, передавая переменные, которые передают каждому частичку то, что им нужно в стеке. Он становится действительно мощным - начинайте думать о структурах типа сетки данных, где строки и ячейки являются отдельными частями, которые получают переменные, которые им нужны из модели, и хранятся в хорошем и чистом виде в отдельных управляемых файлах представления. Но не останавливайтесь на этом, начните думать о таргетинге содержимого заголовка и нижнего колонтитула на основе переменных или трех макетов столбцов, которые создают панель мониторинга, которая отображает все виды по индивидуально сложенным частям на многих уровнях.
Вы теряете всю эту гибкость, когда используете стандартный болтовой метод ASP.NET MVC Helper Html.RenderPartial()
- будьте осторожны, есть решение, подобное приведенному выше.
Дайте мне знать, если это работает ...
Всего наилучшего
Роб Г