4

ASP.NET MVC2 プロジェクトで既定のルートを設定しており、他のコントローラーの一部に対してそれを追加/変更したいと考えています。「id」パラメーター (int) を期待する Details アクションを持つ Customer コントローラーがあるとします。例えば:

    //
    // GET: /Customer/Details/5
    public ActionResult Details(int id)
    {
      //...
    }

ユーザーが「数字以外」を入力した場合に 404 を返すルートを追加するにはどうすればよいですか? 次の「前」のデフォルトルートを追加しようとしましたが、うまくいきませんでした...

    routes.MapRoute(
        "DefaultDigitsId", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index" },
        new { id = @"\d+" }
        );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

可能であれば、デフォルトルートを維持したいことに注意してください...すべてのコントローラーは、「id」(int)パラメーターが必要な「詳細」と「編集」を使用します..達成する方法があるかどうか疑問に思っていますこれは、複数のルート (つまり、一般的なもの) を指定する必要はありません...そしてもちろん、ユーザーが「/Customer/Details/apple」のようなものを入力すると、エラーはスローされず、エラーページに移動することが目標です.. .

デフォルト値を設定することを示唆するこの投稿もありますが、その方法がわかりません...

4

3 に答える 3

3

私はこれを試していませんが、試してみることをお勧めします:

routes.MapRoute(
    "DefaultDetails",
    "{controller}/Details/{id}",
    new { controller = "Home", action = "Details" },
    new { id = @"\d+" }
    );

routes.MapRoute(
    "DefaultEdit",
    "{controller}/Edit/{id}",
    new { controller = "Home", action = "Edit" },
    new { id = @"\d+" }
    );

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

「Customer/Details/1」は最初のルートを使用することを期待します (これは ID を数値として検証し、「Customer/Edit/1」への呼び出しは 2 番目のルートを使用し、これも同様に行い、「Customer/Buy への呼び出しは/Orange" は、この方法で ID を検証しようとしない 3 番目のルートを使用します。あなたが何をしようとしているのか理解できましたか? このアプローチが機能するかどうか教えてください.

于 2010-12-09T23:57:28.073 に答える
2

Customer コントローラーの Details アクションへのリクエストを無視する数値 ID に一致するものの後に IgnoreRoute を追加します。

routes.MapRoute(
  "DefaultDigitsId", // Route name
  "{controller}/{action}/{id}", // URL with parameters
  new { controller = "Home", action = "Index" },
  new { id = @"\d+" } // match numeric id
);

routes.IgnoreRoute("Customer/Details/{*pathInfo}");

routes.MapRoute(
  "Default", // Route name
  "{controller}/{action}/{id}", // URL with parameters
  new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
于 2010-12-09T23:28:03.297 に答える
0

文字列に解析できない値は、呼び出し時に id 値を null にするため、id が null でない場合はエラー ページにリダイレクトできます。

もう 1 つの可能性は、id という名前のパラメーターがあるかどうかをチェックし、それが null の場合はエラー ページにリダイレクトするグローバル フィルターを登録することです。

于 2010-12-09T23:18:31.320 に答える