【问题标题】:How to access property of parent in validation attribute如何在验证属性中访问父属性
【发布时间】:2018-12-19 07:43:02
【问题描述】:

在下面的代码中,我想检查 AttributeValidation 是否给定了一个字段,该字段依赖于其父元素的属性。类中的注释

RequiredIfParentState1

最好地描述了我的问题。

public class ChildModel()
{
   [RequiredIfParentState1]
   public string ImRequired { get; set; } 
}

public class ParentViewModel()
{
   public int state { get; set; }
   public ChildModel child = new ChildModel();
}

public class RequiredIfParentState1: ValidationAttribute, IClientModelValidator
{
   RequiredIfParentState1()
   {

   }
   void AddValidation(ClientModelValidationContext context)
   {

   }

   protected override ValidationResult IsValid(object i_value, ValidationContext i_context)
   {
      var element = i_context.ObjectInstance;

      if(i_value == null && //what do i have to put here to check if the state is 1?)
      {
         return new ValidationResult($"Field is Required in state 1.");
      }

      return ValidationResult.Success;
   }
}

【问题讨论】:

  • 你不能。 ValidationContext 是属性类(在您的情况下为 ChildModel)。它不知道任何父类
  • 我害怕听到这个......有什么好的解决方法吗?
  • 最简单的方法是在单个视图模型中拥有所有属性
  • 好的,谢谢......但在我的情况下,这将是一个非常大的数百行 - 我还考虑在每个“ChildModel”中创建一个存储在构造函数中的父属性.. .
  • 为什么不在ChildModel 中包含一个bool IsRequired 属性并根据父模型中state 的值进行设置

标签: validation asp.net-core-mvc asp.net-core-2.0 validationattribute


【解决方案1】:

我觉得这是错误的方法。

对象处于有效状态是一回事(必填字段和类型检查),但处理业务逻辑是另一回事。

您可以编写一个验证服务,详细检查模型、检查业务逻辑问题并建立错误列表。

如果发现错误,您可以在回复中返回这些错误。

【讨论】:

  • 在我看来,我有一个很大的过程,我要求用户在过程的不同步骤中放入不同的属性。这就是我想要达到的目标。进程的当前状态存储在父模型的一个属性中,只有在这种状态下,用户才需要填写子模型的一些属性。 (他不能填写所有需要的,因为他可能看不到它,因为他在这个过程中还不够远)。然而,能够回顾流程中的较早步骤而不丢失未保存的更改是一项业务需求
猜你喜欢
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
相关资源
最近更新 更多