2012-08-23 24 views
0

在一个MVC项目中,我有一个类(比方说)10个属性,都是必需的。在用户选择的情况下,我必须一次只验证3个属性,其他时间验证所有属性。MVC部分验证(ModelState.IsValid VS ModelState.IsValidField)

这些都是我的类病人的特性:

[Required(ErrorMessage = "Last Name is required")] 
    [StringLength(50)] 
    public string responsibleLastName; 

    [Required(ErrorMessage = "First Name is required")] 
    [StringLength(50)] 
    public string responsibleFirstName; 

    [Required(ErrorMessage = "Address is required")] 
    [StringLength(50)] 
    public string responsibleAddressLine1; 

    [Required(ErrorMessage = "City is required")] 
    [StringLength(50)] 
    public string responsibleCityName; 

    [Required(ErrorMessage = "State is required")] 
    [StringLength(2)] 
    public string responsibleStateCode; 

    [Required(ErrorMessage = "Zip Code is required")] 
    [StringLength(10)] 
    public string responsiblePostalZoneOrZIPCode; 

    [Required(ErrorMessage = "Birth Date is required")] 
    public DateTime responsibleBirthDate; 

    [Required(ErrorMessage = "Gender is required")] 
    public string responsibleGenderCode; 

    [Required(ErrorMessage = "Home Phone is required")] 
    [StringLength(10)] 
    public string responsibleHomePhone; 

保存前,在控制我做的验证:

if (firstCondition) //partial validation 
     {  if (!ModelState.IsValidField("responsibleLastName")) 
      { 
       ModelState.AddModelError("responsibleLastName", "Last Name is required"); 
      isOK = false; 
      } 
       //... and 2 more validation 

       //finally I check the isOK value 

       if (!isOK) 
        return PartialView("firstCondition", model); 
       else 
        // do something 

     } 
else { //validate all the properties from the model 
    if (!ModelState.IsValid) 
      return PartialView("secondCondition", model); 
    else 
      //do something 
} 

在第一种情况下,我的信息是重复的那些3个属性+类的所有错误消息。

ModelState.IsValidField正在调用Model.IsValid并获取每个属性的ModelValidationResult列表,然后检查我想要的字段的结果?为什么消息是重复的?

我想用模型验证工具,所以我不想手工验证其值

//NOT 
if (!model.responsibleLastName == "") 
      { 
       ModelState.AddModelError("responsibleLastName", "Last Name is required"); 
      isOK = false; 
      } 

预先感谢您。

+0

只是一个简短的问题你为什么要在模型中做一次验证两次一次在控制器 –

+0

我认为ModelState.IsValidField(“responsibleLastName”)只是检查模型的注释。正如我所说的,我不想手动验证,如果我使用ModelState.IsValid检查所有的字段,即使我只需要3个。 –

+1

基本上,只要你对你的模型进行了验证,就像你对所有的模型进行了验证一样所有这些都需要验证会自动绑定到您的视图,如果您认为您不想在其中某些验证上使用验证,那么从模型中删除所需验证,并验证您认为可能需要在客户端上的验证或你这样做的方式 –

回答

1

您可以参考此博客post中指定的自定义RequiredIf验证属性。