1

这是我的路由模式。

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

样本值:

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

网址:

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

当相同的多个单词出现在 url 中时会出现问题,在这种情况下,单词是“bali”。

Page.RouteData.Values["sublocationurl"]

导致pemuteran-bali-jeda-villa而不是“pemuteran”

Page.RouteData.Values["villaurl"]结果是3br而不是“ jeda -villa-bali-3br”

4

1 回答 1

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)));

希望这会有所帮助

----------以前的无效答案

您可以尝试向您的子位置 url 参数添加一个正则表达式约束,以声明它不能包含“bali”。

像这样的东西:

routes.MapPageRoute(
    "villadetail", 
    "{sublocationurl}-bali-{villaurl}-details", 
     "~/VillaDetail.aspx", 
     true, // checkPhysicalUrlAccess, value at  your will
     defaults:new RouteValueDictionary {},
     constraints: new RouteValueDictionary { { "sublocationurl", @"((?!bali).)*"}})
于 2013-03-05T09:27:22.603 回答