2013-06-03 17 views
5

にnullエントリが含まれている私は、カスタム、以下のマッピングされたルートasp.net-MVCルーティングの問題:パラメータ辞書はパラメータ

編集してルーティングを設定しようとしています:私の完全なルートの設定

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.. 
    } 

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

パラメータ辞書は、パラメータにnullエントリが含まれている「fixtureId」

私はちょうど「ID」、その後、次のURLは、検索結果を動作するために追加のアクションのパラメータを変更する場合は奇妙なことが、あります/ Add/1。私は混乱している、私のカスタム1をオーバーライドしているいくつかのデフォルトのルーティングはありますか?パラメータを 'Id'だけに変更するのはなぜですか?ただ、テストする

編集

は、私はそれに応じてルートを編集し、今では動作しますので、私はそれがデフォルトのルーティングの問題です数えるアクション

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

に別のパラメータを追加しました。

+0

あなたが呼び出すことができるようにしたい場合も、この – rajansoft1

+1

の前または後に設定され、そのいずれかの他のルートでありますidを指定せずに 'Add'を実行すると、' fixtureId'はヌル入力可能でなければなりません - 'int? fixtureId'。 "オプション"は、URLの中にある必要はないので、 'public ActionResult Add(){/ * no parameters * /}'のようなアクションを持つことができることを意味します。 – Alex

+0

私が考えることができるものnullではないintを使用しているということですか? IdはおそらくMVCフレームワークに焼き付けられているので、おそらく動作が異なります。 – David

答えて

6

コントローラアクションでnull可能なintを使用します。

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

実際にIDであれば、ユーザーがnull /空白のIDを要求した場合、どのように反応するのでしょうか。そのIDはDBのキーですか? IDが空白/ヌルの場合は、デフォルトのページを処理または提供できる場合はnullにすることができます。

EDIT:

ASP.NETリクエストで正体不明のパラメータは、あなたのケースでは、idであることを前提としていますので、これは、Results/Add/1は、1は未確認です。 fixtureIdを使用してコードを動作させる場合は、Results/Add?fixureId=1を使用してください。最終的にはルーティングのためではなく、アクションのパラメータが原因です。

EDIT2:また

、あなたはルーティングの競合が呼ばれて経験しているものを。あなたのルートはDefaultと競合しています。 constraintsを適用しようとすることができます。

+0

私はそれをnullableにしてそれに応じて処理することができます。問題は、実際にResult/Add/1で値を渡すときです。たとえば、渡された値が常にnullです。 – nik0lias

+0

私の編集をチェックしてください。 – aiapatag

+1

これで十分ですが、可能であれば、ユーザーからパラメータを隠したいと思っていましたが、フォームを投稿していただきありがとうございました。ありがとうございました。 – nik0lias

1

開発者が 'NullableConstraint'を呼び出す方法を追加してください。clicky linkオプションのパラメータが指定されている場合は、その値をチェックできます。

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

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 } 

ので: 1 /例外は、「パラメータ辞書が「パラメータにnullエントリが含まれていますfixtureId MVCがデフォルトルートからルーティングへと移動するため、アクションリンクまたはルートフォームの特定のルート名を指定しないと ''が表示されます。だから、このように、加工することができるカスタムルーティングするために特定のルート名を与える必要があります。

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

チアー

関連する問題