2017-02-22 17 views
2

我有一個解決方案的結構是這樣的:有道路線在一把umbraco ASP.NET/IApplicationEventHander VS ApplicationEventHandler VS 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」中,以及在Umbraco實例的「Views」目錄中。

我對.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?

另外,我必須對節點ID進行硬編碼。我讀過有動態的方法嗎?這個例子會很棒。

實現結構化多站點Umbraco MVC解決方案的最佳方式的例子就是我所要求的,關於路由控制器,一些細節或者強示例的鏈接。我已經搜索和研究,並且有一些零碎的東西,但並不是一個很好的例子,就像我正在使用的東西。我將不得不爲這個時候創建​​的每一個頁面創建一個RouteMap,我不知道這是否是最有效的方法。我甚至嘗試過實現一個DefaultController,但是當你的解決方案有多個控制器時沒有看到這一點。

回答

5

我不完全確定你想用這個做什麼,但我會試着解釋它是如何工作的,也許你可以在事後澄清。

我假設你有Umbraco的基礎知識(基於文檔類型創建文檔類型+文檔)。這就是通常使用Umbraco的方式,它會自動爲您在網站中創建的每個「內容節點」(文檔)進行路由。

因此,創建一個名爲document1的文檔,它將自動在您的網站上路由到URL:http://localhost/document1。默認情況下,這個文檔將通過一個默認的MVC控制器來提供,並且它將全部在幕後進行,而無需執行任何操作。

路由劫持允許您覆蓋此默認行爲並「插入」控制器,以便干預請求的處理方式。要使用劫持功能,您可以使用文檔類型的別名創建RenderMvcController。那可能是HomePageController : RenderMvcController

該控制器應具有以下簽名的動作:

public override ActionResult Index(RenderModel model) 

在這次行動中,你可以修改模型被髮送到你喜歡的任何方式的看法。這可能是 - 獲取一些外部數據添加到模型或觸發某些邏輯或您需要執行的任何操作。

這一切都通過命名約定自動掛鉤,您不必手動註冊任何路由即可工作。

您可以創建的另一種類型的Umbraco MVC控制器是SurfaceController。這通常用於處理呈現子動作和表單提交(HttpPost)。 SurfaceController也由Umbraco自動路由,並且位於「不太漂亮」的URL上。然而,由於它通常不會用於任何事情,除了呈現子動作和進行表單提交之外,它的位置並不重要。

除了這些自動佈線的控制器,您當然可以像任何標準的MVC網站一樣註冊您自己的MVC控制器。不同的是,與普通的ASP.NET MVC網站不同,Umbraco網站沒有控制器的自動默認註冊,允許路由在創建新控制器時「正常工作」。

因此,如果你想在Umbraco網站上渲染一個普通的舊MVC控制器而不涉及Umbraco中的一個文檔/節點,那麼你必須爲它註冊一個路由,就像你在任何其他MVC站點中一樣。這樣做的最好方法是使用ApplicationEventHandler類將其添加到路由中並將其添加到路由中。這將在應用程序啓動時自動觸發 - 實質上允許您執行通常在App_Start中執行的操作。

只是要清楚 - 如果你計劃使用Umbraco的數據,你不應該使用普通的MVC控制器,並且不應該要求做任何手動路由註冊。您通常想要在Umbraco中創建的文檔/節點的上下文中呈現模板/視圖(您可以在其中修改文檔的數據/屬性),然後路由劫持就是要走的路。


從什麼樣子,它可能似乎是正確的方式做你正在嘗試做的是簡單地創建兩個文檔類型:

FDirectorySDirectory

您點擊允許在root中創建這兩個文件,然後創建名爲FDirectorySDirectory的文檔,並且這些文檔將自動路由到這些URL。創建一個RenderMvcController的名爲FDirectoryController : RenderMvcController的應用程序將確保在請求頁面時用它來劫持路由。

如果您只是試圖設置一個多站點解決方案,我建議您創建一個Website文檔類型,並在您的Umbraco內容樹的根目錄中爲每個站點創建一個節點。右鍵單擊這些節點中的任何一個,並將主機名編輯爲您需要的任何內容。這也可以是一些「子網址」,如/fdirectory/sdirectory,以防您需要在本地主機上測試而不使用多個主機名。

希望這給你所需的指針,否則試着解釋你正在嘗試做什麼,我會看看我是否可以改進我的答案一下!

+0

〜我最關心的是讓我的代碼像我的問題中的目錄示例一樣組織。一些視圖會有自定義控制器,有些則不會。我希望我的所有模型,控制器,幫助器,服務等都位於這些特定站點下的文件夾中。就我所見,Umbraco沒有發現那些模型,幫手等,沒有路由劫持。我已經創建了一個網站文檔類型。但是如果我把目錄放在目錄中,Umbraco就不會找到它們。如果我希望我的視圖,控制器,站點中的目錄結構中的模型,我將如何做到這一點? – charlwillia6