3

既知のコントローラー名のみに一致するように、制約付きのルートを定義したいと思います。これは、同じフォームの他のURLのフォールバックルートを定義できるようにするためです。

具体的には:

/User

(存在する)ユーザーコントローラーのインデックスアクションに移動する必要があります

/History

履歴コントローラー(存在する)のインデックスアクションに移動する必要があります

/es

「es」コントローラーが存在しないため、フォールバックルートを使用して、言語パラメーター値が「es」のホームコントローラーのインデックスアクションに移動する必要があります。

特定の言語でアプリを起動するには、言語コードを含む特別なURLを提供する必要があるため、これが必要です。そのため、ルーティングで有効なコントローラー名と言語名を区別する必要があります。

これを達成するためにどのように実装できRegisterRoutesますか?どうもありがとう!

編集:コントローラーごとに特定のルートを定義できることに気付きました。これは問題ありません(コントローラーは無数にありません)。しかし、個々のルートを定義する必要がないように、これを達成するために一般的な制約に頼ることができるかどうか疑問に思っています。

4

1 に答える 1

3

ルートを定義するときは、「constraints」パラメーターを使用してこれを処理します。

例えば:

RouteTable.Routes.Add(new Route
{
    Url = "{controller}/{action}",
    Constraints = new { controller = "User|History" },
    Defaults = new { action = "Index" }
};

RouteTable.Routes.Add(new Route
{
    Url = "{languageCode}",
    Defaults = new { controller = "Home", action = "Index" }
};

最初に追加されたルートが最初に評価されます。「コントローラー」のトークンが制約と一致しない場合、追加された次のルートが評価され、インデックス アクションとパラメーター languageCode の言語トークンを使用してホーム コントローラーに解決されます。有効な言語のみが一致するように、languageCode トークンにも制約を追加することをお勧めします。次に、キャッチオール ルートとして 3 番目のルートを追加できます。

ブログ投稿Localization and MVCで説明したように、routehandler を使用して languageCode を処理することもできます。

于 2012-09-20T09:24:33.437 に答える