3

私は次のルートを持っています:

context.MapRoute(
    "content",
    "{page}/{title}",
    new { controller = "Server", action = "Index" },
    new { page = @"^[AFL][0-9A-Z]{4}$" }
);

このルートは、次のようなページに使用されます。

/A1234
/F6789
/L0123

ただし、これもキャッチします。/Adminこれは私が望んでいないことです。

次のような一時的なソリューションを配置しました。

context.MapRoute(
    "content",
    "{page}/{title}",
    new { controller = "Server", action = "Index" },
    new { page = @"^[AFL][0-9][0-9A-Z]{3}$" }
);

これは、現在すべてのページの 2 桁目が 0 であるためのみ機能します。

A、F、または L の後に 4 つの大文字を受け入れるようにルートを構成できますが、「dmin」をキャッチしないようにする方法はありますか?

これが当てはまるかどうかはわかりませんが、正規表現は小文字であり、AZのみを指定しているため、「dmin」を受け入れるべきではないと考えています。ただし、MVC ルートとして使用する場合は「dmin」が必要です。ASP MVC が内部的にこれをすべて大文字に変換するかどうかは誰にもわかりませんか?

4

2 に答える 2

7

解決策 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

于 2012-10-22T10:13:14.000 に答える
0

別の代替手段は、次のような正規表現です。

@"^(?!Admin)[AFL][0-9][0-9A-Z]{3}$"

残りの正規表現を試す前に、可能な一致として Admin を除外します。

于 2013-02-01T00:26:37.447 に答える