簡體   English   中英

使用MVC3與常規ASP.NET的文件夾結構

[英]Using MVC3 with folder structure like regular ASP.NET

所以我正在閱讀有關構建MVC3項目的內容,並且有一件事情讓我很煩惱。 項目的文件夾結構決不會對應HTTP請求的路徑。 有很多我喜歡和想要使用的東西,但是有一個扁平的文件夾結構不是其中之一。

為什么這是個問題? 好吧,我認為在構建一個內容頁面和各種表單/動態頁面(我們大多數網站都是這樣)的網站時會出現問題,這通常是由不同的人完成的。 對於客戶端開發人員來說,遵循動態頁面的路由規則和/或創建新的規則似乎太復雜了。

我想了解的是,是否有辦法以這樣的方式配置MVC3應用程序:

  1. 它遵循目錄結構來查找沒有顯式路由映射的控制器
  2. 視圖與相應的控制器位於同一文件夾中
  3. 路由魔術仍然適用於動作和參數

例如,我想要一個請求/fus/ro/dah/嘗試在\\webroot\\fus\\ro\\dah\\文件夾中找到DahController並執行其Index操作。 如果沒有找到它會在\\webroot\\fus\\ro\\文件夾等中尋找帶有Dah動作的RoController

完全有可能MVC根本不是這樣工作的,我只是想把一個方形的釘子壓成一個圓孔。

更新:看起來我可以將視圖文件拖放到所需的文件夾結構中,它將被執行。 然而,布局顯然不會起作用,因為它期待一個控制器。 這是否意味着我必須為純內容頁面創建一個控制器? 這是一個非常糟糕的設計......

更新2:現在的主要問題是創建“fus”文件夾意味着MVC甚至不會嘗試查找FusController ...不在“fus”文件夾下,也不在其他任何地方。 有可能解決這個問題嗎?

你可以混合使用Asp.net和Asp.net MVC。 正如LukLed所說,MVC是配置模式的慣例。 如果你遵循慣例。 你不需要配置。 你可以查看這個鏈接,將asp.net內容與MVC3混合在一起

混合Asp.net和Razor

例如,我想要一個請求/ fus / ro / dah /嘗試在\\ webroot \\ fus \\ ro \\ dah \\文件夾中找到DahController並執行其Index操作。 如果沒有找到它會在\\ webroot \\ fus \\ ro \\文件夾等中尋找帶有Dah動作的RoController。

MVC不是為這樣的特定需求而設計的,它是使用模型 - 視圖 - 控制器模式構建應用程序的通用框架。

如果你不能彎曲框架的應用程序,你可以彎曲應用程序的框架 ,老實說,MVC是非常可定制的。 [作為一個證明,在當前的項目中(從ASP遷移到MVC),我正在工作,我們將模型作為xml,沒有類,我們也使用XSLT進行渲染。 通過一些工作,我們創建了自定義組件,如自定義視圖引擎,自定義驗證提供程序,自定義模型綁定器......以使框架最適合應用程序,它確實如此]

MVC不是設計的,也沒有強制使用它 ,你可以自定義/擴展你想要的。 在您的情況下,您可能需要創建一個

自定義控制器工廠 (因為您想要自定義控制器的選擇方式),

自定義視圖引擎 (因為您要自定義視圖的放置位置)

也許是其他人。

對於自定義控制器工廠,您必須擴展DefaultControllerFactory類。 您可以通過Google找到很多文章,介紹如何創建自定義控制器工廠。

根據您使用的視圖引擎,您必須擴展相應的視圖引擎。 對於前者 如果您正在使用Web表單,那么您必須擴展WebFormsViewEngine ,然后使用RazorViewEngine

有關更多信息。 檢查此鏈接

http://codeclimber.net.nz/archive/2009/04/08/13-asp.net-mvc-extensibility-points-you-have-to-know.aspx

我相信ASP.NET MVC不應該以這種方式使用。 雖然您可以配置MVC來執行此操作,但最好保留標准/controller/action/parameters URL格式。 如果您的網站具有許多不同的功能,那么這些區域可能會有所幫助http://msdn.microsoft.com/en-us/library/ee671793.aspx 每個區域都有自己的控制器,模型和視圖集,因此在網站不同部分工作的團隊不會互相干擾。

雖然聽起來很方便,但該框架首先搜索DahController並執行Index操作,然后搜索另一個,我發現它不好主意。 URL應該被明確定義,帶有Ro動作的Fus控制器不應該只是停止工作,因為有人創建了帶有Index動作的RoController。

考慮使用區域。 我認為這幫助我誠實地克服了MVC的文件夾結構問題。 所以我可以使用基本文件夾作為我的主頁詳細信息,然后我可以有一個“管理員”區域,這是一個單獨的文件夾,類似的東西。

如何“常規ASP.net”你想要它? 如果你想用MVC混合使用“遺留”的ASP.Net Web Forms,你當然可以 - 將MVC與“基於文件的aspx”混合 - 也稱為“混合”。 在一天結束時,它都是ASP.Net。

這是Visual Studio生成的標准MVC應用程序。 我添加了一個文件夾somedirectory ,我想使用舊folder/file.ext范例,並有一個default.aspx Web窗體文件:

VSC的MVC腳手架與物理目錄

  • 我可以通過http://foo.com/somedirectory導航到它嗎? 是的
  • 我也可以使用“漂亮的網址”嗎?

由VS生成的Vanilla Global.asax ,剛剛添加了MapPageRoute

....

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    //using "pretty urls" - ordering your routes matter.
    routes.MapPageRoute("theWebForm", "legacy", "~/somedirectory/default.aspx");

    routes.MapRoute(
        "Default", 
        "{controller}/{action}/{id}", 
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
}
  • 所以現在我可以通過http://foo.com/legacy導航到它

只需檢查您的路線順序,並可能計划您的命名約定,這樣您就不會有“碰撞”......

心連心....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM