2017-02-22 25 views
2

У меня есть структура решения, как это:Правильный способ маршрута к контроллерам в Umbraco ASP.NET/IApplicationEventHander против ApplicationEventHandler против RouteConfig.cs, RenderMvcController и т.д.

MyApp.Core 
--Properties 
--References 
--bin 
--Events 
    |EventHandlers.cs 
--Directory 
    --Controllers 
    |DirectoryController.cs 
    --Helpers 
    |ContextHelpers.cs 
    --Models 
    |DirectoryModel.cs 
--AnotherSite 
    --Controllers 
    --Helpers 
    --Models 
    --Services 
--Shared 
    --Controllers 
    |HomePageController.cs 
    --Helpers 
    |Extensions.cs 
|app.config 
|packages.config 

MyApp.Umbraco 
--Properties 
--References 
--bin 
etc........ 
--Views 
    --Directory 
    --Partials 
     |DirectoryFilters.cshtml 
    |DirectoryBase.cshtml 
    |DirectoryHome.cshtml 
    |FDirectory.cshtml 
    |SDirectory.cshtml 
    --Partials 
    --Shared 
    |Base.cshtml 
    |Web.config 
etc........ 

Мой экземпляр Umbraco использует модель и контроллеры от моего Проект «Core». Существует вложенная структура каталогов из-за нескольких веб-сайтов в одной установке, в «Core», а также в каталоге «Views» в экземпляре Umbraco.

Я по-прежнему довольно нобею к .NET MVC, и я понимаю захват маршрута, но документация для маршрутизации Umbraco тонкая. У меня есть следующие:

EventHandlers.cs

namespace MyApp.Core.Events 
{ 
    /// <summary> 
    /// Registers site specific Umbraco application event handlers 
    /// </summary> 
    public class MyAppStartupHandler : IApplicationEventHandler 
    { 
     public void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) 
     { 

     } 

     public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) 
     { 
      RegisterCustomRoutes(); 
     } 

     public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) 
     { 

     } 

     private static void RegisterCustomRoutes() 
     { 
      // Custom Routes 
      RouteTable.Routes.MapUmbracoRoute(
       "FDirectory", 
       "fdirectory/{id}", 
       new 
       { 
        controller = "Directory", 
        action = "FDirectory", 
        id = UrlParameter.Optional 
       }, 
       new PublishedPageRouteHandler(1000)); 

      RouteTable.Routes.MapUmbracoRoute(
       "SDirectory", 
       "sdirectory/{id}", 
       new 
       { 
        controller = "Directory", 
        action = "SDirectory", 
        id = UrlParameter.Optional 
       }, 
       new PublishedPageRouteHandler(1001)); 

      RouteTable.Routes.MapUmbracoRoute(
       "HomePage", 
       "", 
       new 
       { 
        controller = "HomePage", 
        action = "Index", 
        id = UrlParameter.Optional 
       }, 
       new PublishedPageRouteHandler(1002)); 
     } 
    } 

    public class PublishedPageRouteHandler : UmbracoVirtualNodeRouteHandler 
    { 
     private readonly int _pageId; 

     public PublishedPageRouteHandler(int pageId) 
     { 
      _pageId = pageId; 
     } 

     protected override IPublishedContent FindContent(RequestContext requestContext, UmbracoContext umbracoContext) 
     { 
      if (umbracoContext != null) 
      { 
       umbracoContext = ContextHelpers.EnsureUmbracoContext(); 
      } 

      var helper = new UmbracoHelper(UmbracoContext.Current); 

      return helper.TypedContent(_pageId); 
     } 
    } 
} 

DirectoryController.cs

namespace MyApp.Core.Directory.Controllers 
{ 
    public class DirectoryController : RenderMvcController 
    { 
     public DirectoryController() : this(UmbracoContext.Current) { } 
     public DirectoryController(UmbracoContext umbracoContext) : base(umbracoContext) { } 

     public ActionResult FDirectory(RenderModel model) 
     { 
      return CurrentTemplate(new DirectoryModel(model.Content)); 
     } 

     public ActionResult SDirectory(RenderModel model) 
     { 
      return CurrentTemplate(new DirectoryModel(model.Content)); 
     } 
    } 
} 

Так Umbraco не устанавливает с App_Start папку. Я хотел бы знать, какой лучший подход для многосайтовой установки Umbraco для регистрации маршрутов к контроллерам. Моя реализация работает, но мне кажется, что мне не нужно создавать действия для каждой отдельной страницы, которую я буду иметь на сайте, в каждом контроллере. Я знаю, что Umbraco имеет свою собственную маршрутизацию, поэтому, используя концепции Umbraco, концепции ASP.NET MVC и все, что еще доступно, как лучше всего реализовать этот тип структуры решений? Должен ли я даже беспокоиться об использовании RouteConfig.cs и создании каталога App_Start? Или я делаю лучший подход? Должен ли я использовать IApplicationEventHandler или ApplicationEventHandler?

Кроме того, мне нужно жестко закодировать идентификаторы узлов. Я читал, что есть способ динамически? И пример этого будет замечательным.

Примеры наилучшего способа реализации структурированного многоузлового решения Umbraco MVC - это то, о чем я прошу, что касается маршрутизации контроллеров, с некоторыми деталями или ссылками на сильные примеры. Я искал и исследовал, и там есть кусочки, но не очень хороший пример, как то, с чем я работаю. Я собираюсь создать RouteMap для каждой отдельной страницы, которую я создаю на этом этапе, и я не знаю, является ли это наиболее эффективным способом сделать это. Я даже попытался внедрить DefaultController, но не понял, когда ваше решение будет иметь несколько контроллеров.

ответ

5

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

Я предполагаю, что у вас есть основы Umbraco, которые были разработаны (создание типов документов + документов на основе типов документов). Так обычно используется Umbraco, и он автоматически выполняет маршрутизацию для каждого из этих «узлов контента» (документов), созданных вами на сайте.

Создайте документ с именем document1 и он будет автоматически маршрутизирован на вашем сайте по адресу: http://localhost/document1. По умолчанию этот документ будет обслуживаться через стандартный MVC-контроллер, и все это будет происходить за кулисами, если вы ничего не сделаете.

Сбой захвата маршрута позволяет вам переопределить это поведение по умолчанию и «засунуть» контроллер, который позволяет вам мешать тому, как обрабатывается запрос. Чтобы использовать захват, вы создаете RenderMvcController с псевдонимом вашего типа документа. Это может быть HomePageController : RenderMvcController.

Этот контроллер должен иметь действие со следующей подписью:

public override ActionResult Index(RenderModel model) 

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

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

Другим типом контроллера Umbraco MVC, который вы можете создать, является SurfaceController. Обычно это используется для обработки рендеринга дочерних действий и представления форм (HttpPost). SurfaceController также автоматически маршрутизируется Umbraco и будет расположен на «не очень симпатичном» URL-адресе. Однако, поскольку он, как правило, действительно не используется ни для чего, кроме предоставления дочерних действий и приема форм, на самом деле не имеет значения, на каком URL он находится.

Помимо этих автоматических контроллеров, вы, конечно же, можете регистрировать свои собственные контроллеры MVC, как на любом стандартном веб-сайте MVC. Единственное отличие заключается в том, что в отличие от обычного веб-сайта ASP.NET MVC, на сайте Umbraco нет автоматической регистрации по умолчанию контроллеров, позволяющих маршрутизации «просто работать» при создании нового контроллера.

Итак, если вы хотите, чтобы простой простой MVC-контроллер отображался на сайте Umbraco без привязки к документу/узлу в Umbraco, вам нужно будет зарегистрировать маршрут для него, как если бы вы сделали это на любом другом сайте MVC , Лучший способ сделать это - подключить и добавить его в Маршруты, используя класс ApplicationEventHandler. Это будет автоматически запускаться во время запуска приложения - по существу, позволяя делать то, что вы обычно делаете в App_Start.

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


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

FDirectory и SDirectory

Вы нажимаете на разрешите их создание в корне, а затем создайте документы с именем FDirectory и SDirectory, и они будут автоматически маршрутизироваться по этим URL-адресам. После этого создается RenderMvcController 'FDirectoryController : RenderMvcController, чтобы убедиться, что он используется для захвата маршрутизации всякий раз, когда запрашивается эта страница.

Если вы просто пытаетесь настроить многоузловое решение, я бы предложил вам создать тип документа Website и создать узел для каждого сайта, который вы хотите, в корне вашего дерева контента Umbraco. Щелкните правой кнопкой мыши каждый из этих узлов и отредактируйте имя хоста, чтобы он был тем, чем вам нужно. Это может быть также «дочерний url», например, /fdirectory или /sdirectory, если вам нужно протестировать это на локальном хосте без использования нескольких имен хостов.

Надеюсь, это даст вам нужные указатели, в противном случае попробуйте объяснить, что вы пытаетесь сделать, и я посмотрю, смогу ли я немного уточнить свой ответ!

+0

~ Меня больше всего интересует сохранение моего кода как в примере с каталогом в моем вопросе. Некоторые представления будут иметь пользовательские контроллеры, а некоторые - нет. Я хочу, чтобы все мои модели, контроллеры, помощники, службы и т. Д. Находились в папках под этими конкретными сайтами. Насколько я могу судить, Umbraco не находит эти модели, помощники и т. Д. Без захвата маршрута. Я уже создал тип документа на сайте. Но если я поместил представления в каталоги, Umbraco их не найдет. Если я хочу, чтобы мои взгляды, контроллеры, модели в структуре каталогов по сайту, как мне это сделать? – charlwillia6

Смежные вопросы