2013-03-05 90 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