2017-10-04 16 views
3

、我々はVisual Studioでのコントローラを足場とき、我々は、デフォルトのアクションを取得:一部のデフォルトのMVCアクションでIDがnullになるのはなぜですか? ASP.NET MVCのアプリで

  • インデックス
  • 編集
  • 詳細
を削除
  • を作成します。

    上記のうち、いくつかは、パラメータのためのnullable id(int? id)を持っています:Details、Edit(GETバージョン)、Del ete、DeleteConfirmed。そして、少なくとも一部では、そのIDを確保するために、次のコードがありますnullではない:

    if (id == null) 
    { 
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    

    すべてのこれらのアクションにはIDが必要です。オプションではありません。何もないことの詳細を表示したり、何も削除したりすることはできません。また、nullの場合はBadRequestステータスコードを生成します。

    なぜ、これらのパラメータはnullではない整数で始まるのですか?

  • +4

    URLは文字列、 "id"はintです。ルート内のパラメータをintに変換できない場合はどうなりますか?何らかの一般的なエラーか、コントローラが無効な(つまりヌルの)IDで何をするべきか指示する必要がありますか? – maccettura

    +0

    ありがとう、@ maccettura。しかし、nullの場合は、ユーザーに知らせるために例外をスローする必要があります。あるいは、Visual Studioが私たちのために生成するチェックを介してそれを検出する必要がありますか? – Alex

    +2

    いつも例外を投げるべきですか?何か特別な処理が起こるはずですか?ログに記録する必要がありますか? MVCコードに含まれているボイラープレートコードは単なる提案であり、要件ではありません。 – maccettura

    答えて

    3

    intのデフォルト値は0です。提案する通りにint idに設定すると、モデルバインダーはデフォルト値0を与えます。つまり、0が実際に提供されたかどうかを区別することはできません。

    EDIT:もう少し考えてみました。一般的なルーティングテンプレートの上位レベルで定義されているためオプションです。一部のアクションはそれを必要とし、他のアクションは必要としません。

    このような単純なパラメータのデフォルト値0については間違っていました。コメントを参照してください。

    +0

    Hmm。それはまったく考えていませんでした。ええ、 '0'は有効なレコードIDですが、' int? idは真に空白/ヌルを提供します。 – Alex

    +3

    間違っている - 例外がスローされた場合 –

    +0

    実際には、上記は真ではありません:idを空白のままにしてページに移動しようとすると、単純に爆発して「パラメータ辞書にnullエントリが含まれています'MyController'の 'System.Threading.Tasks.Task'1 [System.Web.Mvc.ActionResult] Edit(Int32)'メソッドのnullableでない型 'System.Int32'のパラメータ 'id'。オプションのパラメータは、参照型、null可能型、またはオプションのパラメータとして宣言する必要があります。パラメータ名:parameters'。だから0にデフォルト設定されていないのです – Alex

    関連する問題