其实不是小问题。我忽略了连字符作为分隔符的特殊属性。
您可以选择一条自定义路线来纠正您的参数(来自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).)*"}})