Переопределение шаблонов виджетов в Orchard CMS - PullRequest
1 голос
/ 16 января 2012

У меня есть простой виджет, который я создал с помощью ContentPart. ContentPart имеет соответствующий драйвер, виджет может быть размещен в любом месте на моем сайте Orchard, и все отлично работает! Виджет должен получить некоторые данные от пользователя, проверить их, обработать и затем отобразить ответ об успешном выполнении в виджете.

Для этого я определил контроллер, который принимает запрос POST, который будет обрабатывать модель и возвращать то же представление MyForm, если оно недопустимо, или возвращать представление FormSuccess, если оно допустимо. Шаблон части виджета использует @Html.Partial("MyForm") для отображения представления MyForm, содержащего форму Ajax, которая обновит содержащее div с ответом POST. Контроллер вернет представление MyForm или FormSuccess в зависимости от данных.

Проблема, с которой я столкнулся, заключается в том, что моему конструктору необходимо переопределить частичные представления для представления MyForm и представления FormSuccess, он может легко переопределить шаблон отображения Part, но не частичные представления.

Я думаю, что причина, по которой это невозможно в данный момент, заключается в том, что я использую @Html.Partial("MyForm"). Я обнаружил, что если я использую @Display(New.MyForm()) вместо этого, я могу переопределить представление MyForm, создав файл MyForm.cshtml в папке Views для текущей темы, это именно то, что мне нужно, но как мне сделать эквивалент для @Display в действии контроллера?

В данный момент я делаю return this.PartialView("MyForm", model) или return this.PartialView("FormSuccess"), который будет использовать исходные представления, а не переопределенные. Я заметил, что существует ShapeResult, но я не уверен, что это правильно, и я не знаю, как сгенерировать динамический параметр конструктора. Также в идеале мне нужно, чтобы представление MyForm имело строго типизированную модель, чтобы я мог использовать методы HtmlHelper LabelFor, TextboxFor и ValidationMessageFor, что невозможно, если модель является динамической?

Кто-нибудь делал что-то подобное раньше или кто-нибудь может предложить какое-нибудь руководство?

Спасибо, Jason

Ответы [ 2 ]

0 голосов
/ 05 марта 2012

Мне удалось заставить это работать, изменив способ компиляции моего модуля! Я не совсем понимаю, как это работает, но это имеет!

Изначально я пытался переопределить частичные представления, создавая файлы с одинаковыми именами в папке представлений для текущей темы, это ничего не дало, и с тех пор я пробовал разные подходы.

Что я обнаружил, так это то, что если я заставлю мой модуль динамически скомпилировать, то частичные представления из папки тем будут переопределять связанные представления в моем модуле. Ранее я использовал загрузчик модулей, на который ссылались, потому что я хотел отладить свой модуль, и это был единственный способ, которым я мог добиться этого.

Похоже, что когда модуль динамически компилируется, происходит что-то, что отображает представления из моего модуля в основные представления в теме!

Вот хорошая ссылка , которая объясняет загрузку модуля.

0 голосов
/ 27 января 2012

Вы пробовали что-то подобное?

public ActionResult YourAction(){
  //where yourContent is a your widget content
  //and _contentManager is IContentManager
  dynamic model = _contentManager.BuildDisplay(yourContent);
  return View((object)model);
}
...