2013-05-13 118 views
1

MVC如何計算出我的路由細節,我感到有些莫名其妙。讓我看看我能否解釋這個權利。使用「可選」路由的MVC路由

所以...因爲我有默認路由...

routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "CMS", action = "GetPage", id = UrlParameter.Optional } 
); 

而且我的應用程序是一個內容管理系統,所以我想從網站結構創建漂亮的URL,這樣我就圖個通配符網址,讓我確定我是否需要渲染基於什麼在我的數據庫中的404 ...

routes.MapRoute(
    "CMS", 
    "{*path}", 
    new { controller = "CMS", action = "GetPage", path = string.Empty } 
); 

這裏存在的問題。

MVC將基本上將所有內容都匹配到默認路由,因爲從技術上講沒有參數是必需的,假設「CMS」控制器上的「GetPage」不需要參數,這不是我想要的。

我想對它說什麼就像「給定2或3個url部分,找一個控制器和動作匹配一個可選的id參數,但對於所有其他網址,包括你無法匹配的網址此路線落入CMS路線「。

唯一的「輕鬆」的方式,我發現這樣做是對第一條路線改變這樣的事情...

routes.MapRoute(
    "Default", 
    "Get/{controller}/{action}/{id}", 
    new { controller = "CMS", action = "GetPage", id = UrlParameter.Optional } 
); 

然後啓動任何URL「GET /」將匹配路徑和所有其他路線會自動落入第二條路線,但這並不代表我腦海中的某個地方,我無法弄清楚爲什麼(我認爲這是因爲它不能真正解決問題,它只是簡單地移動它) 。

我的問題是,我真的不希望,說:「沒有給出值匹配這條路線呢」,所以我改成了這樣的路線......

routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}" 
); 

現在的一些奇怪的原因,從字面上每要求是所有的捕獲(不是我想要但接近)。

那麼任何想法傢伙?

編輯:

我來到一個觸摸這個接近...

routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new { id = UrlParameter.Optional} 
    ); 

...但現在匹配與2份「富/欄」的所有網址,而不是像它通過下降應該去其他路線,因爲沒有「富」控制器。

回答

0

好的我有一個解決方案,它適用於我,因爲99%的請求需要映射到CMS路由,但在您的情況下,如果您需要映射到很多控制器可能不會。

我希望能找到所有的理想解決方案,但這只不過是我的方案的理想......

因此,假如你有(像我)只是一個CMS控制器和一個帳戶控制器,你可以做這樣的:

routes.MapRoute("Account", "Account/{action}", new { controller = "Account" }); 

    routes.MapRoute(
     "Default", 
     "{*path}", 
     new { controller = "CMS", action = "GetPage", path = string.Empty } 
    ); 

這樣,只有網址開頭的「帳戶」獲得通過的第一條規則抓到,一切落空至默認路由,並得到由CMS控制器處理。

我打算添加更多的路線,因爲我添加更多的控制器。這不是一個理想的解決方案,因爲它可能意味着我在很長一段時間內會有很多路線映射,但它是一個足夠好的解決方案,可以滿足我的需求。

希望它可以幫助別人。

0

也許我不完全理解你的問題,但爲什麼不能有這樣的路線:

routes.MapRoute(
    "CMS", 
    "CMS/{action}/{path}", 
    new { action = "GetPage", path = string.Empty } 
); 

,它默認的路徑前添加到路由集合...

+1

我想說「這裏的可能映射到控制器的url的格式,但是如果您發現控制器不存在與url的第1部分,因爲它的名稱通過默認路由並映射到cms控制器上的getpage「 – War 2013-05-19 10:42:11

+0

我對此問題的回答確實如此解決問題,但它不是一個理想的,因爲我將不得不爲每個控制器創建一個規則來匹配它們。我希望能夠使用更全球化的東西,一個可以做同樣事情的規則,這個解決方案基本上與我的相同,它不會捕獲所有存在的控制器,並且可以通過它們不存在的地方。 – War 2013-05-19 10:45:15