解決策 1: カスタム ルート制約クラス
デフォルトのルート処理は、URL を照合するときに大文字と小文字を区別しません (以下のコードを参照)。そのため、大文字と小文字の管理者も一致します。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);
}
最後の行は、指定された正規表現のルート制約に実際に一致します。ご覧のとおり、大文字と小文字は無視されます。したがって、2 番目に考えられる解決策はRoute
、このデフォルト クラスから継承する新しいクラスを作成し、大文字と小文字を区別しないようにメソッドをRoute
オーバーライドすることです。他のすべては同じままでかまいません。ProcessConstraint