実際には些細な問題ではありません。セパレーターとしてのハイフンの特殊な性質を見落としていました。
パラメータを修正するカスタムルートに行くことができます(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).)*"}})