在 ASP.NET MVC 中实现条件验证
ASP.NET MVC 中的数据注解提供了一种便捷的方式来对模型属性执行验证。但是,有时您可能需要实现条件验证规则,其中字段的有效性取决于另一个字段的值。
示例:条件必填字段
考虑以下场景:我们有一个包含 "IsSenior" 属性和一个包含描述的 "Senior" 属性的 "Person" 模型。我们希望只有当 "IsSenior" 设置为 true 时,"Senior.Description" 属性才成为必填字段。
数据注解方法
仅使用数据注解,这是不可能的。以下代码演示了此限制:
<code class="language-csharp">public class Person { [Required(ErrorMessage = "*")] public string Name { get; set; } public bool IsSenior { get; set; } public Senior Senior { get; set; } } public class Senior { [Required(ErrorMessage = "*")] public string Description { get; set; } }</code>
IValidatableObject 方法
ASP.NET MVC 3 引入了一种更好的解决方案,用于使用 IValidatableObject 接口进行条件验证。您的模型必须实现此接口并提供一个接受 ValidationContext 参数的 Validate 方法。此方法可以执行自定义验证逻辑,如果发现任何错误,则返回 ValidationResult 对象的集合。
<code class="language-csharp">public class Person : IValidatableObject { public string Name { get; set; } public bool IsSenior { get; set; } public Senior Senior { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { if (IsSenior && String.IsNullOrEmpty(Senior?.Description)) yield return new ValidationResult("必须提供描述。"); } }</code>
通过实现 IValidatableObject 接口,我们现在可以根据 "IsSenior" 的值执行条件验证。"IsSenior" 为 true 时,"Senior.Description" 属性将成为必填字段。
改进的语法 (C# 6.0 及更高版本)
在 C# 6.0 及更高版本中,可以使用表达式主体成员简化 Validate 方法:
<code class="language-csharp">public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) => IsSenior && String.IsNullOrEmpty(Senior?.Description) ? new[] { new ValidationResult("必须提供描述。") } : Enumerable.Empty<ValidationResult>();</code>
通过以上方法,我们可以有效地实现ASP.NET MVC中的条件验证。 注意使用了空条件运算符(?.)来安全地访问Senior.Description,避免空引用异常。
以上是如何在 ASP.NET MVC 中实现条件验证?的详细内容。更多信息请关注PHP中文网其他相关文章!