2009-02-27 105 views
9

我真的很喜歡ASP.NET MVC的工作方式。我很樂意在所有新的Web項目上實現它,但是前幾天我遇到了一個原型障礙,我還沒有找到一個好的解決方案,所以我問你,如何設計一個MVC應用程序那不符合典型的REST模式?舉個例子,我設計的原型有幾頁,但頁面本身不一定與域模型綁定。例如,以一個簡單的註冊網站,這可能有以下網頁:ASP.NET MVC控制器動作設計

  • /Default.aspx
  • /Register.aspx
  • /ThankYou.aspx

有時,這樣的程序可能需要一個管理員部分來處理這些細節,比如調整註冊或查看數據。在標準的ASP.NET Web應用程序,我可以添加以下

  • /Admin/Default.aspx
  • /Admin/ListRegistrations.aspx
  • /Admin/ViewReports.aspx ...

難道是從MVC模式不可接受的偏差,在這種情況下,有兩個控制器,諸如:

  • 首頁 - >索引
  • 首頁 - >註冊
  • 首頁 - >三江源
  • 管理 - >指數
  • 管理 - > ListRegistrations
  • 管理 - >報告

我這個挫折是一個事實,即加劇目前還沒有真正可靠的子控制器和區域實施。我意識到菲爾哈克把「地區」原型放在一起,但它不是很成熟,坦率地說,我不確定我喜歡它的設置方式,但我真的不知道我想怎麼樣去看看那個工作。

我想當我想到MVC時,我傾向於認爲REST也是,而且控制器代表頁面而不是實際實體或動作的動作不會與我坐在一起。你怎麼看?

回答

3

您可以隨時將ASP.NET Web窗體與MVC混合使用。

只需添加

routes.IgnoreRoute("Pages/{*path}"); 

到你的路由表,並添加傳統的Web表單頁面給應用程序的文件夾Pages

1

您可以擁有儘可能多的控制器;該佈局看起來合理。請注意,路線不是已將直接映射到{controller}/{action},但它使事情變得簡單。看起來對我很好 - 除了我可能有ThankYou作爲一個視圖 - 即註冊[GET]可能使用不同的視圖來註冊[POST]

+1

我想我對模式的困惑/挫折真的開始建立時,談論一個典型的情況下,可能有嵌套的文件夾來分離功能。例如,面向用戶的產品控制器,然後是用於維護產品的Admin-> Products控制器。哪裏?怎麼樣? – Chris 2009-02-27 14:22:08

3

MVC的新人犯的一個錯誤是將操作分組到控制器出於顯示原因。在你的情況下,與MVC團隊在示例項目中完成的操作一樣,不要將Register和ThankYou操作與主頁分組,而是將它們分離到AccountController中。無論您想爲最終用戶使用路由,您都可以使用路由來設置Url的運行狀態。

至於你的其他動作,ReportController怎麼樣?然後,您可以另外擁有一個AdministrationController,其索引操作/視圖包含指向各種管理操作(包括ReportController上的操作)的鏈接。

簡短版本:按功能將行爲分組爲控制器,而不是站點導航。

+0

我明白了,但觀點呢?在我描述的場景中,我可能希望管理部分的控制器操作繼承單獨的母版頁,而不是用戶部分的母版頁。基於他們使用的母版頁,以這種方式隔離視圖似乎沒有一種合理的方法。 – Chris 2009-02-27 14:26:30

+0

controller actions = views,我的意思是 – Chris 2009-02-27 14:27:25

3

我通常將「Home」控制器作爲項目中的第一件事物,並用「Page」控制器取而代之。我用那個「只是」一個頁面。像「常見問題」,「聯繫我們」等。我這樣做至少部分是因爲對於主控制器的默認方法需要在每次需要基本靜態頁面時添加新方法。

在該控制器中,我只有一個操作:顯示。該操作爲所有這些頁面提供了相同的上下文對象。實際上,我使用查找「slug」將這些頁面的內容存儲在數據庫中,並將其綁定到NVelocity模板中,但即使只是靜態HTML或NVelocity模板也可以工作。

像其他人說的,其他任何東西都會被管理的「事物」分割成控制器。因此,一個ReportController,用戶或AccountController,CartController等,然後這些行動更有意義。

當你在談論列出註冊用戶時,它實際上是一個用戶列表,所以我會有一個UserController並執行/ User/Display/Registered/MostRecent或類似的操作。對於註冊本身,/用戶/註冊將發佈到/ User/SaveRegistration,然後可以從那裏重定向到/ User/DisplayProfile/NewUserID或/ Page/Display/Home。