在@JotaBe 给出的答案的基础上,您可以在 Model 属性本身上使用自定义验证属性。像这样的东西:
有条件的必需属性
public class ConditionalRequiredAttribute : ValidationAttribute
{
private const string DefaultErrorMessageFormatString
= "The {0} field is required.";
private readonly string _dependentPropertyName;
public ConditionalRequiredAttribute(string dependentPropertyName)
{
_dependentPropertyName = dependentPropertyName;
ErrorMessage = DefaultErrorMessageFormatString;
}
protected override ValidationResult IsValid(
object item,
ValidationContext validationContext)
{
var property = validationContext
.ObjectInstance.GetType()
.GetProperty(_dependentPropertyName);
var dependentPropertyValue =
property
.GetValue(validationContext.ObjectInstance, null);
int value;
if (dependentPropertyValue is bool
&& (bool)dependentPropertyValue)
{
/* Put the validations that you need here */
if (item == null)
{
return new ValidationResult(
string.Format(ErrorMessageString,
validationContext.DisplayName));
}
}
return ValidationResult.Success;
}
}
应用属性
在这里,我有一个类 Movie 并且根据 RatingIsRequired 布尔属性的值需要评级,该布尔属性可以从服务器设置。
public class Movie
{
public bool RatingIsRequired { get; set; }
[ConditionallyRequired("RatingIsRequired"]
public string Rating { get; set; }
}
- 有了这个,如果设置为 true 并且 为空,
ModelState.IsValid
则将返回 false 。RatingIsRequired
Rating
- 您还可以编写一个自定义的不显眼的 jquery 验证器来进行客户端启用的验证,这样就可以像常规
[Required]
属性一样工作。
让我知道这是否有帮助。