我有一个由多个字段和嵌套对象组成的复杂模型。
我的目标是仅在至少一个属性具有值
时才验证嵌套对象例如
public class MyModel
{
public Submodel element;
}
public class Submodel
{
[required]
public string attr1;
[required]
public string attr2;
}
我已经进行了客户端验证。但这些字段是空的,服务器端验证仍然失败。
有什么想法吗?
答案 0 :(得分:0)
只要您在模型的属性上有[Required]
注释,如果该属性为null(即ModelState.IsValid
将为false),则模型将不会通过验证。如果您希望attr1
或attr2
中至少有一个值具有验证通过的值,您可以在自定义注释中定义该值,也可以将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
。