2016-04-30 40 views
2

との真の私は私のMVCコントローラMVC ModelState.IsValid = nullに必要なプロパティ

public class MyController : Controller 
{ 
    public ActionResult Index(ModelVM modelVM, FormCollection collection) 
    { 

     if (!ModelState.IsValid) 
      return Json(new 
      { 
       Result = "ERROR", 
       Message = "Missing fields." 
      }); 

     return Json("OK"); 
    } 
} 

このモデル

public class ModelVM 
{ 
    private string _rD; 
    [Required] 
    public string RD 
    { 
     get 
     { 
      return _rD; 
     } 
     set 
     { 
      _rD = RCodes.Contains(value)? value : null; 
     } 
    } 

    private static List<string> RCodes = new List<string> 
    { 
     "OK", 
     "OTHER", 
     "ANOTHER" 
    }; 
} 

を持っている私が送っ:{ RD: "Whatever" }

そしてModelState.IsValid=trueをデバッグインチWebApiコントローラにも同様のコードがあり、期待通りに動作します(modelstate.valid=false

MVCがそうしている理由はありますか?または私のコードに何が間違っていますか?

+0

。 – Nkosi

+1

'ModelState.IsValid'は、' ModelState'にモデルエラーが追加されたかどうかを示します。この場合は、ModelStateにエラーがないため、真です。あなたはあなたに '{RD:"何でも}}を送ったと言った。デフォルトのモデルのバインダーは送信されたデータを見て、目的のタイプとプロパティを一致させます。バインディングの観点から、バインダーが辞書を見たときに、入力データに必要なプロパティー「RD」が提供されたため、 '[Required]'検証が満たされました。 – Nkosi

答えて

2

ModelState.IsValidは、ModelStateにモデルエラーが追加されたかどうかを示します。

この場合は、提供されたデータにModelStateに影響するクライアント側のエラーがないため有効です。

あなたが言った...

を私が送っ{RD:「どのような」}

...モデルバインダーが送信されたデータを見て、プロパティと一致することを意味しています意図されたタイプである。モデルバインディングの観点から、[Required]検証が満たされました。これは、バインダーが、必要なプロパティーRDのルート値辞書を調べたときに、クライアントによって受信データに提供されたためです。あなたはif文にブレークポイントを置けばmodelVM.RD` `に格納されているもの値デバッグ時

あなたは手動であなたができる状態を無効にしたい場合は

...

public ActionResult Index(ModelVM modelVM, FormCollection collection) 
{ 
    if(ModelState.IsValid) { 
     if(modelVM.RD == null) { 
      ModelState.AddModelError("RD", "RD is invalid."); 
     } 
    } 

    if (!ModelState.IsValid) 
     return Json(new 
     { 
      Result = "ERROR", 
      Message = "Missing fields." 
     }); 

    return Json("OK"); 
} 
+0

こんにちは、私はそれをしたくなかったが、私はそうしなければならないと思います。なぜWebApiコントローラで同じロジック([必須]、_rD = RDCodes.ValidMethod ...)がModelState.IsValid = falseであるのか知っていますか? – user3131922

+1

コードは同じように見え、同じ方法で使用されるかもしれませんが、Web APIで使用されるロジックはMVCと同じではありません。そのため、vNextバージョンでは、コードベースを1つに統合したのです。 – Nkosi

関連する問題