2017-10-04 5 views
2

HttpPostによって帰属されるおよびEditのアクションメソッドがあり、タイプがmodel、たとえばBlogViewModelであるとします。ModelState.IsValid = trueは、渡されたモデルパラメータがnullでないことを保証しますか?

[HttpPost] 
public IActionResult Create(..., BlogViewModel model) 
{ 
.... 
} 

[HttpPost] 
public IActionResult Edit(..., BlogViewModel model) 
{ 
.... 
} 

私たちは通常、次のように検証します。ここで

if(ModelState.IsValid) 
{ 
// do something 
} 

do somethingmodelのプロパティにアクセス、操作することができます。

質問

私はmodelnullなっている可能性があるか否かを確認していません。 modelnullの場合、(たとえば、modelのプロパティにアクセスするなど)は例外をスローします。

私は多くの例を(インターネットと教科書から)読みましたが、次のように二重チェックをしている人はまだいません。

if(model!=null) 
{ 
    if(ModelState.IsValid) 
    { 
    // do something 
    } 
} 

または

if(ModelState.IsValid) 
{ 
    if(model!=null) 
    { 
    // do something 
    } 
} 

おそらく、条件ModelState.IsValidmodelnullではないことを保証trueです。

私の前提は正しいですか?私は時限の前提をしているのではないかと心配しています。

+1

あなたは –

+0

@StephenMueckeコードで他のエラーがある場合、モデルが唯一 'null'なので次のようになります。だから、それは上記の私のコードに示すように、常にダブルチェックを行う必要があるが、 ?あるいは 'ModelState.IsValid = true'は' model!= null'を保証しませんか? –

+0

とにかく「ヌル」をチェックすることは、一般的には良い考えです。偽的に、それは「ヌル」であってはならず、すべてうまくいっているが、リファクタリングまたは他の誤った構成(例えば、ルーティング)は「ヌル」になる可能性がある。 – DiskJunky

答えて

3

あなたの質問に答えるために、ModelState.IsValidはあなたのモデルがnullかどうかをチェックせず、その場合はエラーをスローします。

リクエストモデルを作成している間に間違えてエンドポイントが期待しているものと一致しない場合、APIではnullモデルを作成するのは簡単です。

他の人があなたのウェブサイトを見て、API呼び出しを見て、楽しいことを決めて、有効なモデルを持っていないリクエストをAPIにあふれさせることができます。

など、ここのように一箇所にヌルモデルをチェックする方法があります。ModelState is valid with null model

1

は、モデルの状態は何ですか? ModelStateは、POST中にサーバーに送信された名前と値のペアの集合を表します。

ModelStateには何がありますか? これらの値は、同じデバッガセッションで表示されます。 enter image description here 各プロパティには、サーバーに送信された実際の値を含むValueProviderResultのインスタンスがあります。

モデル状態の検証エラー... 例えば: - この場合は

[Required] 
public string FirstName { get; set; } 

[StringLength(50, ErrorMessage = "The Last Name must be less than {1} characters.")] 
public string LastName { get; set; } 

falseの場合vaueProvidedResultが例外を持つ

は、あなたの質問に対する過小

にModelStateについての回答を得たホープので、あなたの姓は、50以上のcaracters、にModelStateが含まれている場合modelStateからモデルを処理できますか

モデルナルが自動的にモデル状態が無効の場合

+0

OPは 'ModelState'が何であるか尋ねなかった! –

+0

@StephenMuecke答え全体がわかりますmodelState –

+0

モデルを処理できることを理解する必要があります_ifモデルは自動的に無効ですmodelStateは無効です_は間違っています –

1

答えは単純にいいえです。

ModelStateは、投稿されたフォーム(BeginFormとマークされている)を、検証情報も含むアクションメソッドにバインドしようとします。これは、ビューモデルにどの検証設定を含めるべきかを指定するデフォルトのモデルバインダー設定を持ちます。 RequiredAttributeであるため、必要なフィールドのnull値チェックは、ModelStateDictionary自体ではなく、どの検証設定が存在するかによって異なります。

フォームが送信されると、DefaultModelBinderはviewmodelバインディングを設定し、バインドされたviewmodelクラス内のすべてのプロパティをチェックして検証設定(つまり属性)があるかどうかを確認します。送信された値が条件と一致しない場合(null/RequiredAttributeとマークされたプロパティの空の値)、プロパティに検証エラーが追加され、ModelStateDictionary.IsValidErrorsプロパティカウントに依存するためfalseを返します。ここでModelStateDictionary sourceから採取IsValidチェック機構である:すべてのモデルプロパティがRequiredAttributeを指定せずに/空nullに設定した場合

public class ModelStateDictionary : IDictionary<string, ModelState> 
{ 
    private readonly IDictionary<string, ModelState> _innerDictionary; 

    public ICollection<ModelState> Values 
    { 
     get { return _innerDictionary.Values; } 
    } 

    public bool IsValid 
    { 
     get { return Values.All(modelState => modelState.Errors.Count == 0); 
    } 
} 

従ってが、原因のない検証に依然としてtrueであるModelStateDictionary.IsValid値は、本&作品結合モデル属性。

同様の問題:

ModelState.IsValid even when it should not be?

関連する問題