2017-09-07 3 views
1

多くの場所で、コントローラの動作はパラメータとしてNullable Intです。私はSO研究から、Model Propetry as Nullable and Requiredを置くべきであることを知っています。 Underposting攻撃から保護するのに役立ちます。また、これは、UIフォームのプロパティの「デフォルト値」(datetimeプロパティなど)を見逃すのに役立ちます。コントローラアクションでnull可能なintを使用する必要がありますが、asp.net mvc 5で何が使用されますか?

[Required] 
public DateTime? dateTime {get;set;} 

上記の設定では、デフォルトの日付は表示されません。ここまでは順調ですね。しかし、「?」を使用することの意義は何ですか? ControllerActionで?そして、いつそれを使用するのですか?

現在、私は削除機能を持っていると私は、コード

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Delete(int? resumeId) 
     { 
      var r = _context 
       .Resumes 
       .Where(c => c.ResumeId == resumeId).SingleOrDefault(); 
      _context.Resumes.Remove(r); 
      _context.SaveChanges(); 

      return RedirectToAction("ResumeCenter"); 
     } 

の下に書かれている誰かが、私が使用する必要がないときに私を導くことができます「?」それは意義ですか?私はこのNullable Intリンクを読んでいますが、私は理解できませんでした。親切に私に両方の使い方の例を教えてください。

+0

あなたのメソッドは 'resumeId'の値を期待しています(そして' null'の場合は何も削除されません)。パラメータを 'int resumeId'に変更してください。 –

+0

@StephenMuecke:実世界のシナリオを教えてください。どこで使うべきですか、どこで避けたいのですか? – Unbreakable

+0

'resumeId'は、DBに問い合わせるアクションパラメータです。このパラメーターがNULL可能である場合は、渡されたヌル値を検査する必要があります。削除操作は、削除すべきそれぞれのレコードを見つけるためにIDを必要とするため、nullでないintを使用することは賢明かもしれません。 –

答えて

1

あなたのケースでは、このパラメータをnullにすることはできません。そのIdに基づいてレコードを削除するためのPOSTメソッドは、Idが提供されると予想し、nullという値は予期しないでしょう。

ただし、現在のユーザーがIdのレコードを削除する権限を持っていることを確認し、クエリを返したレコードがnullでないことを確認してからレコードを削除してから悪意のあるユーザーから保護されています(またはその間に別のユーザーが同じレコードを削除した可能性があります)。

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Delete(int resumeId) 
{ 
    ... // check if the user has permission to delete the Resume with this id 
    var r = _context.Resumes.Where(c => c.ResumeId == resumeId).SingleOrDefault(); 
    if (r != null) 
    { 
     _context.Resumes.Remove(r); 
     _context.SaveChanges(); 
    } 
    return RedirectToAction("ResumeCenter"); 
} 

あなたがにリンクされている例は、GETメソッドであり、NULL可能なパラメータを持っていることが適切であり得ることを注意、例えばnullの値が戻ることを意味CategoryIdに基づいてレコードのセットをフィルタリングする方法一致するレコードだけを返すのではなく、すべてのレコードCategoryId

-1

こちらをご覧ください。 .../Products/Update?id = 0 したがって、パラメータidがnullまたはid == 0の場合、製品を作成します。そうでない場合は、製品を更新します。

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Update(int? id=0) 
    { 
     if(id==0) create something else update 

     return RedirectToAction("ResumeCenter"); 
    } 

int? id = 0は、アクションが引数を取らない場合、idは0となることを意味します。 このパラメータはオプションです。

+0

0に設定する必要はありますか?それはデフォルトで正しく行われるべきですか? – Unbreakable

+2

あなたがデフォルトで0に設定した場合、nullableを使用するポイントはありません。 – senz

+0

../products/updateへのポスト・データを使用しない場合、アクションは例外なくNULL値としてIDを取ります。 – Manfice

0

時には、より複雑なコントローラーアクションメソッドで、人がページで何かを選択したかどうかがわかる可能性がある場合があります。

ここでは、複数のページを持たずにintを提供していれば何かを表示したいとします。

もう1つの議論は、後者の部分(?id = xxx)を忘れることのできるアプリやソーシャルメディアで人々が共有できるページ(think:... controller/products?id = 7)です。その場合、可能な顧客にエラーページが表示されます。あなたがしたいのは、そのヌル値を捕まえ、ユーザーを特定の製品ページではなく概要ページにリダイレクトすることです。

他人から言われたように、あなたの気持ちは、あなたの例ではそれほど意味がありません。

関連する問題