5

次のマップされたルートでカスタム ルーティングを設定しようとしています

編集:私の完全なルート設定

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

        #region FixtureAdmin

        routes.MapRoute(
            name: "FixtureEdit",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "FixtureAdmin", action = "Edit", id = UrlParameter.Optional }
        );

        #endregion

        #region Results

        routes.MapRoute(
            name: "ResultAdd",
            url: "{controller}/{action}/{fixtureId}",
            defaults: new { controller = "Result", action = "Add", fixtureId = UrlParameter.Optional }
        );

        #endregion

そして私のコントローラーコード

public ActionResult Add(int fixtureId)
    {
       // return model to view etc..
    }

パラメータをオプションとして指定したにもかかわらず、これは例外になります。

パラメーター ディクショナリに、パラメーター 'fixtureId' の null エントリが含まれています

奇妙なことに、Add アクションのパラメーターを単に 'Id' に変更すると、次の URL が Result/Add/1 として機能します。混乱しています。カスタム ルーティングをオーバーライドしているデフォルト ルーティングはありますか? パラメータを単に 'Id' に変更すると機能するのはなぜですか?

編集

テストのために、アクションに別のパラメーターを追加しました

public ActionResult Add(int? fixtureId, int? testId)

それに応じてルートを編集したところ、機能するようになったので、デフォルトのルーティングに問題があると思います。

4

3 に答える 3

2

2、あなたの投稿から、あなたの問題は、次のようにデフォルトの後にカスタムルートを配置していると思います:

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

        routes.MapRoute(
        name: "ResultAdd",
        url: "{controller}/{action}/{fixtureId}",
        defaults: new { controller = "Home", action = "Add", fixtureId = UrlParameter.Optional }

so: 1/ MVC はルーティングにデフォルト ルートを使用するため、アクション リンクまたはルート フォームに特定のルート名を指定しないと、「パラメータ ディクショナリにパラメータ 'fixtureId' の null エントリが含まれています」という例外が発生します。したがって、次のように、カスタムルートに特定のルート名を付ける必要があります。

@Html.ActionLink("Test custom Route", "Add", "Home", new { fixtureId = 1 }, "ResultAdd")

応援する

于 2013-06-03T10:31:19.097 に答える
1

開発者が 'NullableConstraint'クリック リンクと呼ぶものを追加するこの方法を見てください。したがって、オプションのパラメーターが指定されている場合は、その値を確認できます。

また、受け入れられた回答に続く回答を見て、よりシンプルでクリーンなソリューションと思われるものを確認してください。

于 2013-06-03T10:14:03.027 に答える