2016-04-30 48 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