2

ホームコントローラーに別の名前で2つのアクションメソッドを作成しました

public ActionResult Default()
{
    ViewData["Message"] = "Welcome to ASP.NET MVC!";
    return View("index");
}

public ActionResult Index(int a)
{
    ViewData["Message"] = "Welcome to ASP.NET MVC! and Your Age is " + a;
    return View();
}

私のルーティングコードは次のようになります。

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

routes.MapRoute(
    "Default2", // Route name
    "{Home}", // URL with parameters
    new { controller = "Home", action = "Default" }
);

routes.MapRoute(
    "Default", // Route name
    "{controller}", // URL with parameters
    new { controller = "Home", action = "Default" }
);

しかし、まだ問題が発生しています

http://localhost:7221のような URL を入力すると、ホームが来て Default() メソッドが呼び出されますが、次のような URL を入力すると

http://localhost:7221/Homeその後、エラーが発生します。この状況を処理するために、次のようなルートを定義します

routes.MapRoute(
    "Default2", // Route name
    "{Home}", // URL with parameters
    new { controller = "Home", action = "Default" }
);

しかし、それは機能していません.......理由を教えてください。

http://localhost:7221/Home/88のような URL を入力すると、 Index(int a) メソッドが呼び出されますが、エラーが発生します。どうして

URL http://localhost:7221またはhttp://localhost:7221/Homeを入力すると、 Default() が呼び出され、いつ入力するかが必要です

http://localhost:7221/Home/88の場合、Index(int a) を呼び出す必要があります。私のルートで何が問題になっていますか?どうすれば修正できますか?可能であればルートコードを修正してください。ありがとう

4

4 に答える 4

5

このルールは、実際に必要なすべてをカバーする必要があります。

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

次の点に注意してください。

  1. パラメータ名はメソッドのパラメータと一致する必要がidありaます。フレームワークはそれらと一致できません。上記のルールaでは、メソッドに一致するようにマッピングルールを設定しましたが、両方の場所でより適切な名前を付ける必要があります。

  2. コントローラまたはアクションが指定されていない場合、このルールはデフォルトで/ Home/Indexになります。名前を付けたアクションを実行したい場合はDefault、/ Home/Defaultに移動します

  3. / Home / Index / 21を指定すると、Indexメソッドが呼び出されますが、年齢を指定しないと、ルールに一致するメソッドがないため、問題が発生します。メソッドを追加するpublic ActionResult Index()か、デフォルト値を使用する必要がありますpublic ActionResult Index(int a = 0)

このルールに反するURLの例を次に示します。

  • http://yourapp/-/ Home/Indexに移動します
  • http://yourapp/Home-/ Home/Indexに移動します
  • http://yourapp/Home/Default-/ Home/Defaultに移動します
  • http://yourapp/Home/Index-上記の私のメモを参照してください-これをサポートする方法が必要です
  • http://yourapp/Home/Index/21-/ Home / Indexに移動しa、21として渡されます
于 2012-08-07T08:39:43.577 に答える
4

問題が発生している理由は、ルート パラメータがアクション メソッドと一致しないためです。アクション メソッドには int a が必要ですが、いずれにしてもそれを提供していません。id という整数を提供しています。

routevalues に必要なものは次のとおりです。

        routes.MapRoute(
            name: "Home",
            url: "{controller}/{age}/{action}",
            defaults: new { controller = "Home", action = "Index", age = UrlParameter.Optional }
        );

age パラメータがオプションであることに注意してください。コントローラーは次のようになります。

public class HomeController : Controller
{

    public ActionResult Index(int? age)
    {
        if ( age != null )
            ViewData["Message"] = "Welcome to ASP.NET MVC! and Your Age is " + age;
        else
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }
}

もちろん、id というパラメーターを使用することもできますが、デモ用に age と呼びました。

アップデート:

元のリクエストに近いものを次に示します。

        routes.MapRoute(
            name: "Index_age",
            url: "{controller}/{age}/{action}/{id}",
            defaults: new { controller = "Home", action = "IndexA", id = UrlParameter.Optional }
        );
        routes.MapRoute(
            name: "Index",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

コントローラ:

    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";
        return View();
    }
    public ActionResult IndexA(int age)
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC! and Your Age is " + age;
        return View("Index");
    }
于 2012-08-07T08:37:14.277 に答える
2

Home を囲む中括弧を削除し、ID を Age に変更して、Age のオプションの動作を削除します。

routes.MapRoute(
    "Default1", // Route name
     "Home/{Age}", // URL with parameters
     new { controller = "Home", action = "Index" }
);

あなたが適切に達成しようとしていることを理解できたと思います。そうでない場合は、Route デバッガーを使用してさらに理解することをお勧めします。

https://github.com/Haacked/RouteMagicを試してください(NuGet で RouteMagic.Mvc として利用可能)

私は自分で試したことはありませんが、その 1 つのコンポーネントを使用しています。

幸運を!

于 2012-08-07T11:33:32.353 に答える
1

あなたが得ているエラーは何ですか?ここでは何も仮定したくありません。//localhost:7221/Home 呼び出しが失敗しているのは、最初のルート (id パラメータはオプションであるため) と一致しているためであり、2 番目のルートとは一致していないためだと思います。また、ルート定義のパラメーターの名前は、アクション メソッド宣言のパラメーターの名前と一致する必要があります。

//localhost:7221/Home/88 のような URL を入力すると、Index(int a) メソッドを呼び出す必要がありますが、エラーが発生します。どうして

パラメータの名前を id に変更するか、ルートのオプション パラメータを a に変更します。ルーティング エンジンは、"a" の値を推測できるものを見つけることができないため、null を許可しない int パラメータの代わりに null 値を渡そうとするため、エラーが発生します。

URL //localhost:7221 または //localhost:7221/Home を入力すると、Default() が呼び出されるようにしたい

次に、最後のルートのマッピングをコード ブロックの先頭に移動します。最初にルート コレクションに追加され、localhost:7221/Home が最初に照合されます。

Phil Haack によるこのツールも検討する必要があります。

http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

于 2012-08-07T10:08:46.020 に答える