0

従来のWebフォームアプリをMVCに変換し、一度に1ページずつ処理します。プロジェクトを使いやすくするために、以前はプロジェクトのルートにあったすべてのWebフォームページを/webformsサブディレクトリに移動しました。したがって、/ page.aspx?param = 123の着信リクエストをキャプチャし、それらを/webforms/page.aspx?param=123にリダイレクトする必要があります。これを行う簡単な方法は、そのような要求をそのジョブを実行するコントローラーに渡すルートハンドラーを設定することだと思いました。私は次のようなルートを設定しました:

    routes.MapRoute("WebformsRedirect", "{*page}",
            new { controller = "Webforms", action = "ForwardToPage" },
            new { page = @"\S+.aspx\S*" }
        );

この種の機能は機能しますが、クエリ文字列はキャプチャせず、ページ部分のみをキャプチャします。コントローラでRequestオブジェクトのクエリ文字列を取得できるので、大したことではありませんが、ルートのみを介して取得できると便利です。私のルーティングユニットテスト(Steve SandersonのMVCブックからコピーしたもの)は、クエリ文字列を使用してテストすると実際に正しく合格するため、機能しない理由がわかりません。私の正規表現は間違っていますか?それらは私の強みではありません。

4

1 に答える 1

0

QueryStrings はルーティングの一部ではありません

たとえば、要求し、Controller 、 Actionに"Home/Index?foo=bar"一致するルートがあり、ルーティング情報がこれ以上ない (foo について何も知らない) 場合でも、次のように記述できます。"Foo/Bar"FooBar

class HomeController: Controller {
  ActionResult Index(string foo) {

  }
}

foo変数は等しいbar、なぜですか?渡されたパラメータの値を取得するのはモデル バインダーだからです。

モデル バインダーは、デフォルトで 4 つのリポジトリをチェックします QueryString 、Routing Place Holders 、FormsCollections および Files

だから私が言おうとしているのは、ルートとQueryStringsは2つの異なるものであり、それをキャプチャする必要はないということです

于 2012-06-21T10:31:29.643 に答える