2012-08-26 108 views
1

我正在創建一個網站,我想要動態添加頁面。因此,我想要一個更簡單的URL。我所瞄準的是類似下面的網址:MVC - 默認控制器

http://www.mysite.com/my-page-url 

而不是像下面這樣的URL:

http://www.mysite.com/pageController/my-page-url 

MVC的網址往往是這樣的工作:|url|/|controller|/|action|/|params|

我會喜歡做的是有:|url|/|params|

對於上面的URL,如果參數的值不等於控制器的名稱,那麼我想通過thos e參數爲PageContoller.ProcessDynamicPage。

+0

我很難理解問題在這裏。你可以換一下還是更簡潔一些?另外,如果您已經完成了一些工作,那麼您最好分享這項工作。 – Candide

+0

編輯問題 – rhughes

回答

3

根據您的默認PARAMS是什麼,你可以創建一個route constraint

routes.MapRoute(
     "Default", 
     "{Param1}", 
     new { controller = "ProcessDynamicPage", action = "YourAction" }, 
     new {Param1= @"\d+" } 
    ); 

如果你的參數是一個整數,這是可行的。

如果你的默認參數是字符串或者其他東西,你不能創建一個正則表達式,或者不能實現的東西IRouteConstraint最好的辦法就是爲它創建一個與你的每個控制器匹配的動作,當它通過默認情況下,您已經嘗試進行匹配。

routes.MapRoute(
    "YourController", 
    "YourController\{Param1}", 
    new { controller = "YourController", action = "YourAction" } 
    } 
); 

routes.MapRoute(
    "YourController2", 
    "YourController2\{Param1}", 
    new { controller = "YourController2", action = "YourAction" } 
    } 
); 

routes.MapRoute(
    "Default", 
    "{Param1}", 
    new { controller = "ProcessDynamicPage", action = "YourAction" }   
); 

如果你有很多控制器,你應該真正考慮如何創建你期待什麼約束。

2

使用MVC的默認路由方案,http://www.mysite.com/my-page-url將轉至my-page-url控制器中的Index操作。如果要設置默認的控制器和動作,你可以在你的Global.asax.cs做到這一點,文件,以這樣的:

routes.MapRoute(
    "Default",            // Route name 
    "{action}/{pageName}",       // URL with parameters 
    new { controller = "PageContoller", action = "ProcessDynamicPage", pageName = "" } // Parameter defaults 
); 

更新

如果需要支持更多的路線你可以使用Mark Oreta建議的那種方法創建它們。看看at Scott Gu's blogthis tutorial

+0

好主意。當我添加我的答案時,恐怕我不知道新的MVC方法。 – DavidHyogo

1

在IIS 7中,您需要查看Handler映射。你可以指定一個特定的擴展名,例如* .action,由您的默認控制器處理。我現在有點生疏,但我認爲它在IIS 6中基本上是相同的想法。在我的.Net 2.0應用程序的web.config文件中,我在system.webServer標記內有以下部分:

<system.webServer> 
     <handlers> 
      <add name="defaultAction" path="*.action" 
       verb="*" 
       type="SumikinIntercom.Web.Controller.Controller,SumikinIntercom.Web.Controller" 
       resourceType="Unspecified" requireAccess="None" allowPathInfo="true" /> 
     </handlers> 

因此,任何帶擴展名爲.action的URL都由我的默認Controller類處理。注意尷尬的語法。我必須指定完全限定的類名稱(包括程序集名稱),後跟逗號,然後指定完全限定的程序集名稱。

對於更新的.Net版本,可能會出現令人煩惱的語法變化,所以請留意這些變化。

+0

@rhughes考慮到Zaid關於MVC特殊功能的更具體的答案,這個答案可能有點過時了,但我會留下它,因爲它過去對我來說非常有用。 – DavidHyogo

+0

我明白了,謝謝 – rhughes