EditorFor не работает с производным типом

По крайней мере, я думаю, что это связано с проблемой. Мой сценарий таков:

У меня есть несколько бизнес-сущностей с общими полями, и у каждой есть настраиваемые поля, уникальные для этой сущности. Таким образом, в коде это моделируется как класс 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.

6
задан Carrie Kendall 6 May 2014 в 15:29
поделиться