1

これが私のルーティング パターンです。

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

サンプル値:

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

URL:

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

同じ複数の単語が URL に表示されると問題が発生します。この場合、単語は「バリ」です。

Page.RouteData.Values["sublocationurl"]

"pemuteran"ではなく、pemuteran -bali-jeda-villaとなります。

Page.RouteData.Values["villaurl"]「jeda-villa-bali-3br」の代わりに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 パラメータに正規表現制約を追加して、「バリ」を含めてはならないことを示すことができます。

このようなもの :

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 に答える