2013-03-05 87 views
1

這是我的路由模式。webforms路由多字

routes.MapPageRoute("villadetail", "{sublocationurl}-bali-{villaurl}-details", "~/VillaDetail.aspx"); 

樣本值:

sublocationurl = "pemuteran" 
villaurl = "jeda-villa-bali-3br" 

URL:當相同的多個字出現在url和在這種情況下,詞是 「巴厘島」

www.website.com/pemuteran-bali-jeda-villa-bali-3br-details 

出現問題。

Page.RouteData.Values["sublocationurl"] 

結果佩母德蘭,巴厘島JEDA別墅代替「佩母德蘭」

Page.RouteData.Values["villaurl"]結果3房,而不是「JEDA別墅,bali- 3br「

回答

1

實際上並非微不足道的問題。我忽略了連字符的特殊屬性作爲分隔符。

你可以去定製的路線,這將糾正你的參數(從https://stackoverflow.com/a/14075552/1236044想法):

public class CustomRoute : Route 
{ 
    private String _separator; 

    public CustomRoute(string url, 
     RouteValueDictionary defaults, 
     RouteValueDictionary constraints, 
     RouteValueDictionary dataTokens,String separator,IRouteHandler hdl) 
     : base(url, defaults, constraints, dataTokens, hdl) 
    { 

     _separator = separator; 
    } 

    protected override bool ProcessConstraint(HttpContextBase httpContext, 
     object constraint, string parameterName, RouteValueDictionary values, 
     RouteDirection routeDirection) 
    { 
     if(((string)values["sublocationurl"]).Contains(_separator)) 
     { 
      var wholeParams = String.Format("{0}-{1}-{2}", values["sublocationurl"],_separator, values["villaurl"]).Split(new[]{_separator},StringSplitOptions.None); 
      values["sublocationurl"] = wholeParams[0].Trim('-'); 
      values["villaurl"] = String.Join(_separator, wholeParams.Skip(1)).Trim('-'); 
     } 
     return base.ProcessConstraint(httpContext, constraint, 
      parameterName, values, routeDirection); 
    } 
} 

路線然後可以註冊這樣的:

var separator = "bali"; 

routes.Add("villadetail", 
      new CustomRoute("{sublocationurl}-"+separator+"-{villaurl}-details", 
      new RouteValueDictionary(), 
      new RouteValueDictionary{{ "sublocationurl", @".+"}}, 
      new RouteValueDictionary() 
      , separator, new System.Web.Routing.PageRouteHandler("~/VillaDetail.aspx",false))); 

希望這將有助於

----------上一個非工作答案

Yo你可能會試圖給你的sublocation url參數添加一個正則表達式約束來聲明它不能包含「bali」。

事情是這樣的:對於{} villaurl

routes.MapPageRoute(
    "villadetail", 
    "{sublocationurl}-bali-{villaurl}-details", 
    "~/VillaDetail.aspx", 
    true, // checkPhysicalUrlAccess, value at your will 
    defaults:new RouteValueDictionary {}, 
    constraints: new RouteValueDictionary { { "sublocationurl", @"((?!bali).)*"}}) 
+0

限制值是不是我的選擇。我只需要一些路由來獲得正確的值。 :( – 2013-03-06 02:03:02

+0

@vhinnterrible我的答案沒有限制{villaurl}上的值,它限制{sublocationurl}上的值。你試過了嗎?對於路由模式,如果你想獲得正確的值,你不能允許sublocationurl包含' bali' – jbl 2013-03-06 07:59:14

+0

ooops ..抱歉,我忽視了,我專注於villaurl。反正,現在嘗試它,並導致「服務器錯誤'/'應用程序。資源無法找到。」:( – 2013-03-06 10:28:49