По крайней мере, я думаю, что это связано с проблемой. Мой сценарий таков:
У меня есть несколько бизнес-сущностей с общими полями, и у каждой есть настраиваемые поля, уникальные для этой сущности. Таким образом, в коде это моделируется как класс EntityBase
, и существует ряд классов, производных от него, например, Derived
.
Для создания многоразового пользовательского интерфейса у меня есть представление под названием EntityBase.vbhtml
, которое выглядит так:
@ModelType EntityBase
@Using Html.BeginForm("Edit", Model.GetType.Name)
@* show the editor template for the derived type *@
@* !!the next line renders nothing!! *@
@Html.EditorFor(Function(x) Model, Model.GetType.Name)
[show a bunch of stuff common to all EntityBase objects]
End Using
, а затем одно под названием Derived.vbhtml
для производных классов. который выполняет следующее:
@ModelType Derived
[show an EditorFor for various Derived-specific fields]
Затем, когда вы переходите к \ Derived \ Edit \ 123
, он возвращает представление по умолчанию Derived \ Edit.vbhtml
, который просто делает следующее:
@Html.EditorForModel("EntityBase")
Таким образом, контроллеры просто возвращают ожидаемое представление редактирования по умолчанию, которое является однострочным вызовом представления EntityBase
, которое выполняет свою задачу и вызывает Производный
для рендеринга материала производного класса, о котором он не знает.
Я думал, что это ничем не примечательное, но это не работает. Как отмечено в коде представления, когда я вызываю EditorForModel в представлении базового класса, указывая имя производного класса для использования в качестве шаблона, он ничего не отображает. Я проверил, что если я вызову ту же самую строку кода в шаблоне редактирования верхнего уровня, она будет работать нормально. Итак, в наследовании есть что-то, что не нравится MVC, но я не могу понять, что именно. Пожалуйста помоги!
Обновление : работает так, как я ожидал, если вместо EditorFor
я использую Partial
(и перемещаю соответствующий шаблон в общую папку из папки EditorTemplates), но это не лучшее решение, потому что я думаю, что неудобно не следовать соглашению об именах для шаблонов EditorFor.