Как провести рефакторинг Umbraco для рендеринга контроллеров

Я работаю на сайте Umbraco v7 около 3 лет. Традиционно я не визуализировал какие-либо страницы с помощью контроллеров, однако я настроил некоторые контроллеры, которым я отправляю формы POST, но это все. В мои существующие страницы просмотра встроена логика, и вместо контроллеров используются внешние вспомогательные методы.

Я собираюсь разработать новую страницу и подумал, что пришло время протестировать лучший шаблон дизайна. На этой странице будут отображаться данные из контроллера, а также необходимая отправка формы через контроллер. Каков наилучший маршрут, который также пройдет гладко, если я решу провести рефакторинг на моих существующих страницах просмотра?

Я более конкретно ищу ответ о контроллерах Render vs Surface и о том, какой из них будет лучше. Насколько я понимаю, моя маршрутизация не изменится, если бы я использовал контроллер Render, но если бы я пошел с Surface, мне пришлось бы иметь специальная маршрутизация?

Но если я использовал контроллер рендеринга, он не поддерживает отправку формы?

Не уверен, что еще мне не хватает?

Еще раз спасибо, Девин


person Devin Gleason Lambert    schedule 12.12.2016    source источник


Ответы (1)


Вам не нужно настраивать какую-либо специальную маршрутизацию — все запекается прямо в Umbraco.

Как показывает опыт, контроллеры Surface лучше всего использовать для многократно используемых действий, а настраиваемые контроллеры (перехват маршрута) лучше подходят для добавления пользовательской логики на целые страницы (типы документов/шаблоны) в Umbraco.

Оба подхода позволят вам добиться абсолютно одинаковых результатов — единственное различие между ними — абстракция.

Контроллеры Surface — это дочерние действия MVC, которые наследуются от Umbraco.Web.Mvc.SurfaceController — добавляет полезные свойства и методы, специфичные для Umbraco.

Поверхностные контроллеры хороши для создания многоразовых вещей, таких как формы или в любом другом месте, где вам нужно частичное выполнение чего-либо сложного (т.е. при поддержке контроллера). Взгляните на документация здесь.

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

Для этого вы создаете свой собственный контроллер, а не наследуете его от Umbraco.Web.Mvc.RenderMvcController следующим образом:

public class HomeController : Umbraco.Web.Mvc.RenderMvcController
{
    public ActionResult MobileHomePage(RenderModel model)
    {
        //Do some stuff here, the return the base Index method
        return base.Index(model);
    }
}

Это настраиваемый контроллер для типа документа «Домашний». Конечно, вы можете вернуть пользовательскую модель, которая наследуется от RenderModel, с вашими собственными свойствами и методами.

Более полные примеры и документация можно найти здесь.

Запросы на публикацию

Оба варианта позволяют обрабатывать запросы POST, добавляя атрибут [httppost] следующим образом:

Поверхностный контроллер:

public class YourSurfaceController: SurfaceController
{
    public ActionResult YourAction()
    {
      // Do stuff
    }

    [HttpPost]
    public ActionResult YourAction()
    {
      // Do stuff on POST
    }
}

Контроллер для перехвата маршрута:

public class HomeController : Umbraco.Web.Mvc.RenderMvcController
{
    public ActionResult MobileHomePage(RenderModel model)
    {
        //Do some stuff here, the return the base Index method
        return base.Index(model);
    }

    [HttpPost]
    public ActionResult MobileHomePage(RenderModel model)
    {
        //Do some stuff on POST, the return the base Index method
        return base.Index(model);
    }
}
person Jason Elkin    schedule 13.12.2016
comment
Некоторые дополнительные вопросы: Таким образом, поверхностный контроллер используется для рендеринга дочерних действий MVC или для обработки отправки данных формы. Означает ли это, что его нельзя использовать для рендеринга страницы обычного просмотра? Контроллеры Surface не могут отображать обычные страницы просмотра? - person Devin Gleason Lambert; 13.12.2016
comment
Зачем контроллерам Surface нужна маршрутизация? Контроллеру Surface для отправки формы потребуется маршрутизация, но как насчет контроллеров поверхности дочерних действий, зачем ему нужна маршрутизация? - person Devin Gleason Lambert; 13.12.2016
comment
@DevinGleasonLambert Я думаю, вы, возможно, немного запутались в том, что такое маршрутизация. Маршрутизация — это настройка того, что происходит (т. е. какой контроллер используется) при посещении определенного URL-адреса (или маршрута) в ASP.NET MVC. Что касается вашего вопроса, то Umbraco уже сделала всю маршрутизацию за вас, все, что вам нужно сделать, это добавить соответствующие контроллеры. - person Jason Elkin; 14.12.2016
comment
@DevinGleasonLambert Как я уже сказал, оба будут обрабатывать запросы POST, ЕДИНСТВЕННАЯ разница между ними заключается в том, что один лучше для целых страниц, а другой лучше для частей страниц. - person Jason Elkin; 14.12.2016