2011-10-24 26 views
0

考慮以下途徑:MVC3路由 - 如何在URL中的最後一個破折號之後分開?

 routes.MapRoute(name: "CityHomePage1", url: "{city}-{state}", defaults: new { controller = "Home", action = "GeoHomePage" }); 
     routes.MapRoute(name: "CityHomePage2", url: "{city}-{state}/", defaults: new { controller = "Home", action = "GeoHomePage" }); 
     routes.MapRoute(name: "CityStateResults", url: "{city}-{state}/{searchTerm}", defaults: new { controller = "Results", action = "SearchCityState" }); 
     routes.MapRoute(name: "CityStateCategoryResults", url: "{city}-{state}/{category}/{searchTerm}", defaults: new { controller = "Results", action = "SearchCityStateCategory" }); 

這種運作良好,當城市沒有破折號(「 - 」)在其中,但是我現在從具有下劃線更改多個城市都顯示在URL的方式在他們之間,現在有破折號。

因此,如果URL讀取http://www.site.com/Gardena-Ceretos-Santa_Monica-California/someterm它的路由將不再起作用。

我怎麼會搶狀態一切後,最後一個「 - 」和之前的「/」在我的路線來提取狀態?

現在這個來看,我應該有結構化的URL爲/市惠城區城市/州/ searchtearm,但現在,我必須堅持目前的結構。

謝謝。

回答

0

這是一種情況,路由沒有任何工具來幫助你。有兩種選擇。

首先,改變你的令牌{cityState},請在你的動作方法的參數,並解析在你的控制器動作cityState字符串。其次,將您的令牌更改爲{cityState}(我承諾,這是一個不同的選項),然後使用自定義的RouteHandler來解析cityState字符串,並添加城市和州路由令牌以傳遞給您的現有操作。該RouteHandler看起來像這樣:

using System.Web.Mvc; 
using System.Web.Routing; 

public class MyRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     var routeData = requestContext.RouteData; 
     var cityState = routeData.Values["cityState"].ToString(); 
     var parts = cityState.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); 
     var state = parts.Last(); 
     var citySb = new StringBuilder(); 
     foreach (var part in parts) 
     { 
      if (part != state) 
      { 
       if (citySb.Length > 0) 
        citySb.Append("-"); 
       citySb.Append(part); 
      } 
     } 
     routeData.Values.Add("city", citySb.ToString()); 
     routeData.Values.Add("state", state); 
     var handler = new MvcHandler(requestContext); 
     return handler; 
    } 
} 

然後,更改每個路線是類似這樣的:

routes.MapRoute(
    "CityHomePage1", 
    new Route(
     "{cityState}", 
     new RouteValueDictionary( 
      new { controller = "Home", action = "GeoHomePage" }), 
      new MyRouteHandler() 
     ) 
    ) 
); 
+0

在這裏您將有兩部分的城市,即「Santa_Monica」,這將是保留與「_」,因爲「聖誕老人」和「莫妮卡」本身不匹配,然後從數組的最後()部分獲取狀態。然而,我看到這是如何運作的,就SEO而言,所有城市/州之間都需要分離,所以我需要將它分開構建。我正在考慮一個正則表達式的解決方案,也許? – ElHaix

+0

在你的問題中,你說你必須堅持原來的結構。你改變主意了嗎?如果你沒有改變主意,那麼你的意思是說你需要將它分開構建? – counsellorben

相關問題