2012-04-11 129 views
1

我不太清楚如何去做這件事。基本上我有一個域名,我們將其稱爲domain.com。該域本身就是公司網站,然後有特許經營商網站通過正斜槓參數訪問。因此,例如domain.com/atl可能是加盟商網站。這些加盟商網站與公司網站相同,因此您基本上只是爲每個加盟商重新創建整個網站。MVC中的路由3

對我來說,這是棘手的部分。特許經營商網站上的某些頁面需要進行定製。所以我的想法是,這應該由一個數據庫控制,我只需要將「atl」作爲一個參數命中數據庫並返回基於點擊鏈接的頁面內容,這樣我就擁有了基本上1個視圖文件,可以提供無限數量的加盟商。

我不明白的是你怎麼傳遞這個參數。鏈接例如。比方說,我去domain.com/atl,我點擊一個名爲「東西」的鏈接。你會怎麼做,以這樣的方式發送到「東西」視圖,並將其顯示爲domain.com/atl/stuff而不是domain.com/stuff?

有沒有一個詞來形容這個系統,這將使我的研究更容易?還是有人有一個鏈接,將我指向正確的方向?謝謝。

回答

1

MikeSW is close about the route,但它聽起來像你不希望加盟商頁面與公司頁面共享任何控制器。我有一對夫婦其他的想法太:

routes.MapRoute(null, // do not name your routes, they are "magic strings" 
    "{tenant}/{controller}/{action}", 
    new 
    { 
     // strongly type controller, action, and area names using T4MVC 
     controller = MVC.Home.Name,    
     action = MVC.Home.ActionNames.Index, 
     // it sounds here like you want this controller for franchisees only, 
     // so corporate pages will use other controllers. if this is the case, 
     // tenant="default" // require the parameter by not supplying a default 
    }); 

的理由不來命名你的路由是因爲不點名地迫使你在某些HTML輔助和控制方法,使用某些過載。 RedirectToRoute@Html.RouteLink@Url.RouteUrl等方法中的很多重載將路由名稱作爲第一個參數。通過省略路由名稱,這迫使我們使用僅依賴路由參數和HTTP方法的重載來解析控制器和操作。 (T4MVC在這裏也很有幫助,因爲它允許我們爲這些方法的參數強制鍵入區域,控制器和操作名稱。)

MVC將自動在呈現視圖的URL中使用「環境」路由參數。所以,如果你在URL domain.com/atl和要鏈接到domain.com/atl/stuff,可以輸出這樣一個超級鏈接:

@Html.RouteLink("Stuff", new 
{ 
    // this will render a link with the URL domain.com/atl/stuff 
    controller = MVC.Stuff.Name, 
    action = MVC.Stuff.ActionNames.Index, 
    // you do not need to include franchisee 
}) 

(如果你想渲染只是URL爲一個普通的HTML <a>標籤的href參數使用@Url.RouteUrl代替)

在另一方面,如果你想從一個加盟商網站到另一條鏈路,你就必須指定專營參數:

@Html.RouteLink("Another franchisee in this state", new 
{ 
    // this will render a link with the URL domain.com/macon 
    controller = MVC.Home.Name, 
    action = MVC.Home.ActionNames.Index, 
    franchisee = "macon" 
}) 
+0

T4MVC似乎沒有爲我工作這麼熱。當試圖引用控制器中的視圖時,它給了我一個無效的參數錯誤。 – Nozoku 2012-04-13 16:47:58

+0

奇怪的是,視圖在T4MVC中沒有參數。它們只是MVC對象的靜態屬性。在這裏張貼另一個問題,有人會幫助你。 – danludwig 2012-04-13 17:59:35

+0

我最終修復了它。我不正確地引用它。我試圖在另一個控制器中引用一個視圖,我不知道如何執行它的語法,所以我嘗試了直到我認爲我找到了一些可行的方法,並且這是一種錯誤的方法。 – Nozoku 2012-04-17 02:47:43

0

在路由中,視圖並不重要,只有控制器在選擇要返回的視圖時很重要。畢竟,我認爲這是關於多租戶的,至少在這種情況下,這個租戶非常簡單。有一個路由定義,其中包括租戶名稱或ID

routes.MapRoute("default","{tenant}/{controller}/{action}",new{ tenant="default", controller="home", action="index"}) 

通過這種途徑,如果未指定房客asumed是「默認」(也許是企業網站本身)。

關於一些需要定製的頁面,數據庫是存儲的東西,而不是控制邏輯。我認爲,事情比你想象的要簡單,你只需要在db(某個視圖名稱或CSS,js)中存儲一些定製細節,然後將這些定製細節提供給視圖。基本上,控制器從數據庫獲取所需的最小信息,然後選擇相關視圖,創建視圖模型並返回該視圖。

+0

那麼什麼我要找的是有能力去根據/特許經營商的價值提供內容。所以基本上我需要做2件事。 1:獲取用戶輸入的/加盟商ID並將其用作數據庫中的參數以顯示所選頁面的內容。 2:保持/加盟商ID顯示在瀏覽器的網址欄中,使其顯示在不同的部分,即使該部分不存在。 – Nozoku 2012-04-11 14:39:33

0

通過使用像結構圖這樣的IOC容器實際創建多租戶Web應用程序,您可以採用不同的方法。 Zack Owens has a starter sample on how do this

創建一個多租戶的web應用程序顯然比可以放在一個帖子更多,但你可以msg我,如果你想要更多的信息。

我認爲如果你試圖用路由處理所有這些都會造成一團糟。

+0

有趣的博客系列。雖然我不喜歡使用Spark視圖引擎的部分。這似乎對於複雜的多租戶計劃來說是個好主意,但對於更簡單/更便宜的應用程序來說,這可能是過度的。 – danludwig 2012-04-11 07:26:31

+0

如果我正確理解多租戶,這涉及到多個域是否正確?我不確定這是如何工作的情況下,你只有一個域名? – Nozoku 2012-04-11 14:29:57

+0

他的示例是爲他的用例而創建的,決不能將其放到項目中,但它可以爲您提供一些關於如何讀取請求的想法,根據請求提取IOC容器,並根據該請求提供數據請求。我也不喜歡火花,但這是關於開源的好處。只要改變它。所以爲了無恥的自我推銷,如果你想得到一些詳細的幫助,我會做合同工。 – 2012-04-11 15:49:28