方案一:自定义路由约束类
默认路由处理在匹配 URL 时会忽略大小写(参见下面的代码),这就是您的案例中的Admin也匹配的原因。您应该做的就是编写一个自定义路由约束类,该类实现IRouteConstraint
接口并Match
适当地实现方法以区分大小写。
这是一个让您入门的教程
解决方案 2:自定义Route
类
如果您查看默认Route
类如何处理约束,这是代码:
protected virtual bool ProcessConstraint(HttpContextBase httpContext, object constraint, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
IRouteConstraint routeConstraint = constraint as IRouteConstraint;
// checks custom constraint class instances
if (routeConstraint != null)
{
return routeConstraint.Match(httpContext, this, parameterName, values, routeDirection);
}
// No? Ok constraint provided as regular expression string then?
string text = constraint as string;
if (text == null)
{
throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, SR.GetString("Route_ValidationMustBeStringOrCustomConstraint"), new object[]
{
parameterName,
this.Url
}));
}
object value;
values.TryGetValue(parameterName, out value);
string input = Convert.ToString(value, CultureInfo.InvariantCulture);
string pattern = "^(" + text + ")$";
// LOOK AT THIS LINE
return Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant);
}
最后一行实际上匹配提供的正则表达式路由约束。如您所见,它忽略了大小写。所以第二种可能的解决方案是编写一个Route
继承自这个默认Route
类的新类并覆盖ProcessConstraint
方法以不忽略大小写。其他一切都可以保持不变。