【问题标题】:C# / MVC / Entity Access property from a refrenced model class when validating using IValidatableObject使用 IValidatableObject 进行验证时,来自引用模型类的 C#/MVC/实体访问属性
【发布时间】:2016-11-17 07:45:53
【问题描述】:

我创建了一个 WebAPI Web 应用程序,并通过实现 IValidatableObject 来验证数据。根据验证结果,调用外部 API 并保存模型是否有效的数据。 我已经创建了调用外部 API 的逻辑。

我的模型结构如下:

public class Class1
{
   public string Class1Prop { get; set; }
   public ICollection<Class1Data> Data { get; set; }
}

public class Class1Data : IValidatableObject
{
   public int Id { get; set; }
   public string Prop1{ get; set; }
   public string Prop2 { get; set; }
   ..
   public string Prop10 { get; set; }

   // Validate Model
   private bool validated = false;
   public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
   {
          if (!validated)
          {
                 if ((Prop1 != value1) || (Prop2 != value2) || .. )
                 {
                       // CALL EXTERNAL API
                 }
                 validated = true;
          }     
          yield return ValidationResult.Success;
   }
}       

用于 POST 的 WebAPI 控制器:

[ResponseType(typeof(Class1))]
public async Task<IHttpActionResult> PostClass1(Class1 class1)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    db.Class1.Add(class1);
    await db.SaveChangesAsync();

    return CreatedAtRoute("DefaultApi", new { id = Class1.Id }, class1);
}

当从 Class2 中的 Validate 方法调用外部 API 时,我想包含 Class1Prop 的值。 我试图找到一种方法来做到这一点,并且还搜索了一种方法,但可以找到一个。 我想尽可能地保留模型的结构。 我希望我的问题有任何意义,如果没有记录在案,我很抱歉。

【问题讨论】:

    标签: c# asp.net-mvc validation asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    您可能需要某种类型的委托来从Class1Data 中引用Class1.Class1Prop

    public class Class1Data : IValidatableObject
    {
        public int Id { get; set; }
        public string Prop1 { get; set; }
        public string Prop2 { get; set; }
        public string Prop10 { get; set; }
    
        public Func<string> AcquiresParentProp { get; set; }
    
        // Validate Model
        private bool validated = false;
        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
              if (!validated)
              {
                     if ((Prop1 != value1) || (Prop2 != value2))
                     {
                           // CALL EXTERNAL API
                         if(AcquiresParentProp != null)
                         {
                             var parentProp = AcquiresParentProp();
                             // use parentProp
                         }
                     }
                     validated = true;
              }     
            yield return ValidationResult.Success;
        }
    }
    

    设置委托的方法可以放在Class1:

    public class Class1
    {
        public string Class1Prop { get; set; }
        public ICollection<Class1Data> Data { get; set; }
    
        private string GetProp()
        {
            return Class1Prop;
        }
    
        public void ParentLookup()
        {
            foreach(var data in Data)
            {
                data.AcquiresParentProp = GetProp;
            }
        }
    }
    

    并且可以在验证之前调用该方法:

        [ResponseType(typeof(Class1))]
        public async Task<IHttpActionResult> PostClass1(Class1 class1)
        {
            class1.ParentLookup();
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
    
            db.Class1.Add(class1);
            await db.SaveChangesAsync();
    
            return CreatedAtRoute("DefaultApi", new { id = Class1.Id }, class1);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多