验证ASP.NET MVC中的模型集合

时间:2015-02-25 00:56:59

标签: c# asp.net asp.net-mvc asp.net-mvc-4 model-validation

我有一个类似于此link声明的视图。

<div id="personSection">
<!-- We have more than one personspecificmodel -->
 @if (Model.PersonSpecificModels != null)
 {
     for (var i = 0; i < Model.PersonSpecificModels.Count; i++)
     {            
         <div>
             <div class="formColumn2">@Html.EditorFor(x => x.PersonSpecificModels[i].childProperty1)</div>
             <div class="formColumn2">@Html.EditorFor(x => x.PersonSpecificModels[i].childProperty2)</div>
         </div>
     }
 }
 else
 {
     <!-- This is the form for the new user -->
         <div>
             <div class="formColumn2">@Html.EditorFor(x => x.PersonSpecificModels.childProperty1)</div>
             <div class="formColumn2">@Html.EditorFor(x => x.PersonSpecificModels.childProperty2)</div>
         </div>        
 }

我遇到的挑战是我有一个具有以下声明的模型:

public class PersonModel {
    // Some properties, annotations, etc
    [Required(ErrorMessageResourceType = typeof(Messages), ErrorMessageResourceName = "ValidationErrorRequiredField")]
    [StringLength(100, ErrorMessageResourceType = typeof(Messages), ErrorMessageResourceName = "StringLength")]
    public string property1 { get; set; }
    public List<PersonSpecificModel> PersonSpecificModels { get; set; }

    public class PersonSpecificModel {
        // Some declarations further
        public string childProperty1 { get; set; }
        public int childProperty2 { get; set; }
    }
}

之前,PersonModel和PersonSpecificModel之间存在1:1的关系。我们需要做的一件事是允许多个PersonSpecificModel。考虑让用户拥有不同的银行帐户详细信息。

处理此视图提交的代码是:

    [HttpPost, ValidateInput(false)]
    public new ActionResult MyAction(PersonModel model)
    {      
        if (ModelState.IsValid) // multiple PersonSpecificModels fail here
        {
        }
    }

向模型添加新人时没有问题。我现在面临的挑战是,当用户拥有超过1个PersonSpecificModel时,验证失败,因为它无法正确查看集合。

[问题] 是否有任何方法可以使用现有模型定义正确验证集合?模型验证仅在第一行失败。

1 个答案:

答案 0 :(得分:0)

您可以手动验证每个人并按照您的需要进行处理:

ICollection<ValidationResult> results = new List<ValidationResult>();

bool valid =
    Validator.TryValidateObject(obj, new ValidationContext(obj), results, true);

// results is an out collection parameter containing error messages...