【问题标题】:Conditional Validation for nested object with parent condition具有父条件的嵌套对象的条件验证
【发布时间】:2021-06-08 08:21:28
【问题描述】:

我有以下课程:

class A {
    [Required]
    public string Status { get; set; }
    public B b_instance { get; set; }
}

class B {
    **[RequiredIf("A.Status == 'Active'")**
    public string x { get; set; }
}

如上所述,我希望 B 类具有条件验证:A.Status = 'Active' 然后 B 类具有 [Required] x,否则不需要 b_instance.x。

【问题讨论】:

  • 你可以尝试在razor 中添加validationb 吗? If(Status == 'Active') 有验证 else without ?
  • this 有帮助吗?
  • this?
  • @Izzy 该方法可能会有所帮助,但我需要嵌套类访问父属性的方法,这就是重点

标签: c# validation asp.net-core


【解决方案1】:

如果您使用 MVC,您可以在 razor 视图中添加额外的验证:


@if (Model.Status == "Active")
{
    <input class="form-control" asp-for="..." required="required" />
}
else
{
    <input class="form-control" asp-for="..." />
}

如果像您提到的那样,您需要 BE 方面的解决方案,您可以尝试使用自定义验证属性:


 public class A
 {
      [Required]
      public string Status { get; set; }
      public StatusEnum StatusEnum { get; set; }
      public B b_instance { get; set; }
    }

    public enum StatusEnum
    {
        Active = 1,
        Deactivated = 2,
    }

    public class B : A 
    {
        [RequiredIf("Status", StatusEnum.Active , ErrorMessage = "...")]
        public string x { get; set; }
    }

    public class RequiredIfAttribute : ValidationAttribute
    {
        public string PropertyName { get; set; }
        public object Value { get; set; }

        public RequiredIfAttribute(string propertyName, object value, string errorMessage = "")
        {
            PropertyName = propertyName;
            ErrorMessage = errorMessage;
            Value = value;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            var instance = validationContext.ObjectInstance;
            var type = instance.GetType();
            var propertyValue = type.GetProperty(PropertyName).GetValue(instance, null);
            if (propertyValue .ToString() == Value.ToString() && value == null)
            {
                return new ValidationResult(ErrorMessage);
            }
            return ValidationResult.Success;
        }
    }

【讨论】:

  • 是的,我可以做到,但我想要 BE 方面的解决方案
  • 有了这个解决方案,我认为我们没有很好的方法来处理这个问题。还是谢谢。我决定将它拆分为每个案例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 2022-01-20
  • 2019-08-10
  • 2023-03-08
  • 2015-06-21
相关资源
最近更新 更多