2016-04-30 61 views
2

真我有這個型號MVC ModelState.IsValid =用空所需的屬性

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" 
    }; 
} 

在我的MVC控制器

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"); 
    } 
} 

我送:{ RD: "Whatever" }

而且在調試ModelState.IsValid=true。我有一個WebApi控制器上的類似代碼,並按我的預期工作(modelstate.valid=false

你有一些想法,爲什麼MVC這樣做?或者我的代碼有什麼問題?

+0

在調試過程中,如果你把一個斷點if語句什麼值存儲在'modelVM.RD'。 – Nkosi

+1

'ModelState.IsValid'告訴您是否有任何模型錯誤已添加到'ModelState'。在這種情況下,這是事實,因爲ModelState中沒有錯誤。你說你發了'{RD:「無論」}「。默認模型聯編程序將查看發送的數據並將屬性與預期類型進行匹配。從綁定的角度來看,'[Required]'驗證被滿足,因爲當活頁夾查看字典時,在輸入數據中提供了所需的屬性「RD」。 – Nkosi

回答

2

ModelState.IsValid告訴您是否有任何模型錯誤已添加到模型狀態。

在這種情況下,它是有效的,因爲在提供的數據中沒有會影響ModelState的客戶端錯誤。

你說......

我發{RD:「無論」}

...這將意味着,該模型粘結劑將着眼於發送的數據和匹配性與預期的類型。從模型綁定的角度來看,[Required]驗證符合,因爲當活頁夾查看所需屬性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

Hrmm,我不想這樣做,但我想,我必須這樣做。你知道爲什麼用同一個邏輯的WebApi控制器([required],_rD = RDCodes.ValidMethod ...)ModelState.IsValid = false嗎? – user3131922

+1

該代碼可能看起來相同並以相同的方式使用,但web api中使用的邏輯與MVC中的邏輯不同。這就是爲什麼在vNext版本中他們將代碼庫合併爲一個。 – Nkosi