首页 >后端开发 >C++ >如何在 ASP.NET MVC 中实现条件验证?

如何在 ASP.NET MVC 中实现条件验证?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-08 17:31:41370浏览

How to Implement Conditional Validation in ASP.NET MVC?

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn