2010-07-29 65 views
1

我正在使用ASP.NET MVC 2並希望優化我的路由。期望的結果如下:ASP.NET MVC中的內容感知路由映射2

http://www.url.com/Sites/ 
http://www.url.com/Sites/Search/NY001 
http://www.url.com/Sites/NY001 
http://www.url.com/Sites/NY001/Photos 

這個方案的問題是,我想不同的方式處理URL位取決於它們的內容,在一定意義上。可以想象,「NY001」是特定網站的標識符,而不是生活在Sites控制器中的操作。我目前的解決方案是爲特定於站點的URL定義一個特殊的路由圖,並在此之前單獨指定Sites控制器中的每個操作。

// currently in place, works 
routes.MapRoute("SiteList", "Sites", new { controller = "Sites", action = "Index" }); 
routes.MapRoute("SiteSearch", "Sites/Search/{searchString}", new { controller = "Sites", action = "Index", searchString = "" }); 
routes.MapRoute("SiteNotFound", "Sites/NotFound", new { controller = "Sites", action = "NotFound" }); 
// and so on... 

routes.MapRoute("Site", "Sites/{siteId}/{action}", new { controller = "Sites", action = "Index", siteId = "" }); 

由於這是我的Web應用程序的核心組件之一,這些操作每天都在增加,並且列表變得有點笨拙。我很想能夠提煉出具體的行動路線的一長串一個聲明,與此類似:

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

的問題是路由框架沒有這條新航線和區分的方式在上面的例子中,特定於站點的站點;因此,兩者都是匹配的。我堅持宣佈每個行動分開?我應該考慮使用正則表達式來區分URL的內容嗎?

在此先感謝,如果此問題已以其他形式提出,我事先致歉。

回答

1

不確定你想要完成什麼。當然,你不能真正與一個路線圖與不同的簽名網址,但可以減少列表如下:

routes.MapRoute("Site", "Sites/{siteId}/{action}", new { controller = "Sites", action = "Index" }, new { action = "(?:Index|Photos|News)", siteId = @"[A-Z0-9]+" }); 

對於網址:

http://www.url.com/Sites/NY001 
http://www.url.com/Sites/NY001/Photos 
http://www.url.com/Sites/NY001/News 

這條路線將只映射到操作指數,照片,新聞(以及你在該表達中的其他內容)。