2017-01-26 105 views
0

我有一個ASP.Net MVC網站,「在線學習普通話」。它運作良好,對我來說工作得很好。現在,我想重新使用此網站作爲新網站的模板,「在線學習西班牙語」。這兩個網站將位於完全不同的域和完全不同的服務器上。結構兩個不同的網站,外部頁面不同,內部頁面相同

對於我的「學習中文在線」網站上,網頁1/3是外部頁面,用戶可以瀏覽,而無需登錄到網站其他2/3的網頁是內部頁面,用戶只能看到他們是否登錄到網站。我希望這兩個網站都使用不同的外部網頁(兩個網站的外部.aspx頁面將不同),但是兩個網站共享同一組內部網頁(兩個網站的內部.aspx頁面將相同)。

我的問題是,在ASP.Net MVC中,我怎樣才能爲兩個網站構建我的項目/解決方案?由於兩個網站的唯一區別是外部頁面,我能想到的處理外部頁面的最簡單的解決方案是將每個視圖的映射存儲在數據庫中,根據某個常量(即。WebsiteType)從數據庫獲取映射,在web.config中設置,然後根據映射返回視圖。例如,在我的控制器:

// WebsiteType is stored in web.config. It is set to LearnMandarin for the learn Manadarin 
// online website and it is set to LearnSpanish for the learn Spanish online website 
string websiteType = WebConfigurationManager.AppSettings["WebsiteType"]; 

// figure out which Homepage .aspx view to return, based on the websiteType 
// GetView(...) will get the mapping from the database 
string viewToReturn = GetView(websiteType, "HomepageView"); 

return View(viewToReturn); 

這是我能想到的迄今最乾淨的解決方案,我能想到的最好的結構。我最終會在同一個目錄中有兩個不同的.aspx文件 - 一個是學習漢語在線網站的.aspx頁面,另一個是學習西班牙語在線網站的another.aspx文件。這是構建我的項目的最佳方式,還是有更清晰的方式?

(我使用Visual Studio 2010和ASP.Net MVC版本3.0.0.0)

+0

這真的是什麼*區* MVC的功能有被創造了! – Haney

+0

那麼,你是說我的外部網頁,應該在區域下面,而我的內部網頁是共享的,不應該在區域下面?我是使用區域的新手,所以如果我的速度不夠快,我很抱歉(我正在閱讀它的教程)。 –

+0

您可以根據網站域或其他因素創建一個屬性來設置Area RequestContext數據,然後將頁面放在您認爲合適的位置。 – Haney

回答

0

我或多或少使用哈尼建議的區域。我在我的項目中創建了一個名爲SpanishTutor的區域。創建該區域後,它將具有與典型的ASP.Net MVC項目相同的控制器和視圖文件夾結構(但它將全部位於Areas子文件夾下)。我認爲我的主頁是我的「外部」頁面之一。因此,我在我的SpanishTutor區域下的「controller」文件夾中創建了一個HomeController.cs文件。對於這個HomeControllers.cs文件,我必須將名稱空間更改爲「Tutors.Areas.SpanishTutor.Controllers」,以便它與現有的HomeController.cs文件不衝突。我還在SpanishTutor區域的「views」文件夾下創建了一個包含Index.aspx的Home文件夾。

接下來,我需要註冊我的「學習西班牙語在線」主頁的路由,以覆蓋我的「學習漢語在線」主頁的路由。在創建SpanishTutor區域時,會創建一個名爲SpanishTutorAreaRegistration.cs的.cs文件。在該文件中,將下面的代碼添加到RegisterArea(...):

public override void RegisterArea(AreaRegistrationContext context) 
{ 

    string websiteType = WebConfigurationManager.AppSettings["WebsiteType"]; 

    if (websiteType.Contains("spanishtutor")) 
    { 
    context.MapRoute(
     "SpanishTutor_Root", // Route name 
     "", // override the homepage 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
     new[] { "Tutors.Areas.SpanishTutor.Controllers" } // namespace so there is no conflict with the namespace of the original homeapge 
    ); 
    } 
} 

如果你有多個外部網頁,您可以將每個外部網頁,就像網頁。對我而言,不需要修改Global.asax.cs。

在我的web.config中添加以下(我可以將其更改爲「mandarintutor」爲「學習中文在線」網站):

<add key="WebsiteType" value="spanishtutor" /> 
0

嗯,我會同意@Haney,在一定程度上。這實際上取決於該網站的普通話/西班牙語保護部分的差異。一般來說,保護區和不受保護區之間的區分很簡單。只有登錄用戶可用的控制器/操作應使用[Authorize]屬性進行保護。例如,要將僅註冊普通話的用戶限制在普通話部分,您可以使用角色。例如,將用戶分配給「普通話」角色,然後指定只有該角色的用戶才能訪問它:[Authorize(Roles = "Mandarin")]

在哪裏開始得到更多iffy與普通話和西班牙語部分之間的區別。對於大多數情況,您可以將語言作爲路由參數。換句話說,所有的普通話網頁都會有一個類似於/mandarin/some/page/的URL,而西班牙語網頁則會有一個類似於/spanish/some/page/的URL。然後,您可以使用route參數來切換佈局,在動作或視圖中進行分支等。但是,如果這兩個部分之間存在很大差異,則所有這些分支都可能導致一些複雜的代碼。如果情況變得如此,那麼將每種語言創建爲一個單獨的區域可能更合適。每個區域都會得到一個獨立的路由方案,也就是說,如果您的區域名稱爲Mandarin,那麼該區域中的每個控制器操作都將自動處於一個URL,如/mandarin/some/page/。您不必捕捉路線中的「普通話」部分來確定遊戲中的語言:只需在該區域內觸擊控制器操作,您就會知道。但是,這種方法的缺點是可能會導致代碼重複。您可以通過控制器阻止大部分操作並查看繼承,但可能會出現這種情況,即您仍然以兩個區域中存在非常類似的代碼結束。

+0

謝謝克里斯。我想到了。請看看我發佈的解決方案。謝謝你的幫助! –

相關問題