1

私が書いている小さなアプリに問題があります。今、私のエラーはコントローラークラスにあるか、ルートにあります。以下の画像を参照してください。

コントローラ クラス。

これは私が実行しようとしているコントローラーです

これは私が持っているデフォルトのルートです。

RouteConfig ファイル

そして、これは実行時に表示されるエラーです。画像はあまり鮮明ではありませんが、次のように書かれています。

パラメーター ディクショナリには、'GlobalUnited.WebUI.Controllers.PlayerController' のメソッド 'System.Web.Mvc.ActionResult Detail(Int32)' の null 非許容型 'System.Int32' のパラメーター 'playerId' の null エントリが含まれています。オプションのパラメーターは、参照型または null 許容型であるか、オプションのパラメーターとして宣言する必要があります。パラメータ名: パラメータ

エラー

ここでいくつかの投稿を読みましたが、特に 1 つ: 類似リンク

ダニエル・レンショーが次のように言っているとき、彼は正確に何を意味していますか。

まず、リクエストからパラメーターを自分で引き出すのではなく、MVC のパラメーターの自動処理を使用することをお勧めします。コントローラーアクションには、無視されるように見える id パラメーターがあります-それを使用し、同様の他のパラメーターを追加して、入力パラメーターを取得します。

とにかく、その投稿を読んだ後、RouteConfig ファイルを次のように変更しました。

変更されたルート

それでも、このエラーが発生しました。それは言います:

「DefaultApi」という名前のルートは、ルート コレクションに既に存在します。ルート名は一意である必要があります。パラメータ名: 名前

ルート

Detail アクション パラメータを次のように変更しようとしました。int に注意してください。宣言 方法

そして、変更後にこのエラーが発生しました:

ここに画像の説明を入力

これを修正するためにできることはありますか? すべての助けに感謝します、ありがとう。

4

3 に答える 3

6

パラメータ名playerIDがここで問題を引き起こします。ASP.NET MVCは、デフォルトルートを使用してidという名前のパラメーターのみを提供できます。あなたの場合、playerIDはnull許容またはオプションではないため、リクエストをアクションにマップすることはできません。パラメータ名をidに変更すると、問題が解決します。

public ActionResult Detail(int id)

「DefaultApi」という名前のルートがすでにあるため、ルート登録で2番目のエラーが発生します。パラメータ名を変更した場合(他の場所でも登録されている場合)、このルートは必要ありません。

3番目のエラーは、null値を使用してクエリを実行しようとした場合です。ASP.NET MVCは、URLの値をパラメーターにマップできず、デフォルト値nullを取得します。null値の行がないため、空のシーケンスを取得し、Single()メソッドは例外をスローします。

于 2012-10-07T20:38:14.277 に答える
1

パラメータが呼び出されplayerIdたら、それをルート値としてDetailactionメソッドに渡してから、nullかどうかを確認する必要があります。これにより、質問で示した最後のエラーが処理されます。シーケンスに要素が含まれていません

アクションメソッドでこれを行います。

public ActionResult Detail(int? playerId)
{
   if(playerId.HasValue)
   {
       var model = _dataSource.Players.Single(p => p.PlayerId == playerId);

       return View(model);
   }

   // Handle the other possibility where playerId is NULL
}

ASP.NET MVCが正しいパラメーターバインディングを実行する方法を知るには、上記のアクションメソッドを次のように呼び出す必要があります。次に例を示します。

@Html.ActionLink("Player Details", "Detail", new { playerId = 1 }); 
于 2012-10-07T20:43:10.403 に答える
1

重複ルートエラーを除いて、エラーはDefaultApiルートとは何の関係もありません。そのルートはApp_Start\WebApiConfig.csで構成されているため、重複したルートを取得します

最初の問題は、playerIdという必須のルートパラメーターがあることをMVCに伝えているが、使用しているURLでこのルートパラメーターを指定していないことです。これを機能させるには、ルートを変更してidをplayerIdに変更するか、playerIdクエリ文字列パラメーターをURLに追加する必要があります。http://my.site/Player/Detail/1ルートを変更する場合は、 (ルートを変更する場合)またはのようなURLが必要になりますhttp://my.site/Player/Detail?playerId=1

もう1つのオプションは、パラメーターを変更して、public ActionResult Detail(int id)idという単一のパラメーターを受け取り、それをで終わるフレンドリURLから抽出する既存のデフォルトルートを使用することです/1

メソッドを作成することもできDetail(int? id)ますが、linqクエリの周囲にnullガードを配置する必要があるため(URLにIDを渡さないと、nullレコードを検索できないため)、これを追加する必要があります。 :

if (id.HasValue) {
    // execute linq query
}

または、クエリを変更して、SingleOrDefault()ではなく返すようにすることもできますSingle()

于 2012-10-07T21:10:15.270 に答える