MVC验证嵌套对象

时间:2015-10-21 14:13:05

标签: asp.net-mvc validation

我有一个由多个字段和嵌套对象组成的复杂模型。

我的目标是仅在至少一个属性具有值

时才验证嵌套对象

例如

public class MyModel 
{ 
  public Submodel element; 
}

public class Submodel 
{
  [required] 
  public string attr1;

  [required] 
  public string attr2;
}

我已经进行了客户端验证。但这些字段是空的,服务器端验证仍然失败。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

只要您在模型的属性上有[Required]注释,如果该属性为null(即ModelState.IsValid将为false),则模型将不会通过验证。如果您希望attr1attr2中至少有一个值具有验证通过的值,您可以在自定义注释中定义该值,也可以将ModelState.IsValid与您自己的验证结合使用。例如:

[HttpPost]
public ActionResult SomeAction(MyModel model)
{
  if (!ModelState.IsValid || !YourValidationFunction(model, ModelState))
   {
     return View(Model);
   }
}

public bool YourValidationFunction(MyModel model, ModelStateDictionary modelState)
{
   if (model.submodel.attr1 == null && model.submodel.attr2 == null)
    {
        modelState.AddModelError("submodel.attr1", "only 1 attr can be null!");
        modelState.AddModelError("submodel.attr2", "only 1 attr can be null!");
        return false;
    }
    return true;
}

如果您想在服务类中使用此功能,那么ModelStateDictionary的参数就是存在的;如果两个功能都在控制器中,则不需要它。

答案 1 :(得分:0)

另一种验证对象以测试某个属性/字段是否具有值的方法是实现IValidateableObject

public class SubModel : IValidateableObject
{
    public string attr1 {get;set;}
    public string attr2 {get;set}

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (attr1 == null | attr2 == null) //or some other criteria
        {
            yield return new ValidationResult("Some validation message here");
        }
    }
}

要使用此功能,请在您的操作方法中使用标准ModelState.IsValid,它将调用Validate中的SubModel