2

我正在研究開發一個包含CMS的應用程序。我是一個經驗豐富的網頁表單開發人員,但只是真的只是進入MVC。ASP.NET MVC - CMS問題

我有幾個,我希望你們中的一些人能夠回答問題:

首先,我目前的網絡形成CMS允許用戶創建一個頁面,然後在「滴」任意數量的用戶控件到那個他們創建的頁面。我這樣做的方式是在DB中與路徑一起創建一個條目,然後使用LoadControl方法。

我可以看到我可以用局部視圖來做到這一點,但部分視圖沒有代碼。如果我有可能有100個控件可以放在頁面上,那麼這是否意味着控制器中的ViewBag需要滿足所有100個控件,以防它們在視圖中使用?例如,一個web表單用戶控件將包含邏輯:rptItems.DataSource = blah; rptItems.DataBind()

使用MVC,我假設邏輯將在視圖控制器中,視圖將通過ViewBag訪問它?我對如何做到這一點有些困惑。

其次,你將如何處理深層路由?

EG:

商店/產品/類別是好的,但對商店/產品/分類/運輸/ UK是什麼?我需要在global.asax中爲每條我需要的路線設置一條路線嗎?在Web表單中,我只是調用ReWritePath方法,並使用正則表達式自己處理路由。

感謝您的時間閱讀這一點,並希望回答一些我的查詢

回答

2

關於第二個問題,(即「深路由」),您可以在控制器內處理這個,而不是增加實際的路線。網址的每個部分都可以通過控制器操作中的RouteData.Values集合獲得。所以,你的路線可能看起來像

~/Store/Products/Category/{*params} 

假設典型的路由配置,這將呼籲~/areas/store/controllers/storeControllerCategory(...)操作方法,然後可以從RouteData.Values收集虎視眈眈deliveryuk

還有很多其他方法 - 將數據存儲在數據庫中並使用關聯的元數據找到正確的控制器和方法 - 但我認爲這是最簡單的。此外,它可能是顯而易見的,但如果你真的只在您的示例需要超越「類別」兩個參數,你可以只使用

public ActionResult Category(string category, string region) 
{ 
... 
} 

和路徑:

~/store/{controller}/{action}/{category}/{region}/{*params} 

DeliveryUK會分別映射到類別和區域參數。任何超出uk的內容仍然可以通過RouteData.Values集合獲得。這假定你沒有更具體的路線,如

~/store/{controller}/{action}/{category}/{region}/{foo}/{bar}/{long_url}/{etc} 

這將是一個更好的匹配。 ({* params}可能與第二條路線發生衝突;您必須進行調查以確定是否存在問題。)

關於第一個問題:

可以動態地生成查看源代碼,並返回它作爲控制器的字符串,無需通過ViewBag傳遞了很多東西。如果來自CMS數據庫的虛擬頁面需要包含部分視圖,則在生成頁面時,您應該添加對這些組件的引用。 (這可能會也可能不會解決您的問題 - 如果沒有,請提供更多信息。)

+0

謝謝大衛。路由問題是找到一種解決方案,允許客戶端創建儘可能多的嵌套URL。所以,理論上他們可以有Dir1/Dir2/Dir3/Dir4 ....等等。在網絡形式。我會將每個請求引導至Page.aspx文件,然後根據數據庫中的URL重新編寫路徑。 – Paul