使用IValidatableObject进行验证时,引用模型类的C#/MVC/实体访问属性

使用IValidatableObject进行验证时,引用模型类的C#/MVC/实体访问属性,c#,asp.net-mvc,validation,asp.net-mvc-4,asp.net-web-api,C#,Asp.net Mvc,Validation,Asp.net Mvc 4,Asp.net Web Api,我已经创建了一个WebAPI web应用程序,我正在通过实现IValidatableObject来验证数据。根据验证结果,调用外部API并保存数据(无论模型是否有效)。 我已经创建了调用外部API的逻辑 我的模型具有以下结构: public class Class1 { public string Class1Prop { get; set; } public ICollection<Class1Data> Data { get; set; } } public cla

我已经创建了一个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;
   }
}       
公共类1
{
公共字符串Class1Prop{get;set;}
公共ICollection数据{get;set;}
}
公共类ClassData:IValidatableObject
{
公共int Id{get;set;}
公共字符串Prop1{get;set;}
公共字符串Prop2{get;set;}
..
公共字符串Prop10{get;set;}
//验证模型
私有布尔验证=假;
公共IEnumerable验证(ValidationContext ValidationContext)
{
如果(!已验证)
{
如果((Prop1!=value1)| |(Prop2!=value2)| |……)
{
//调用外部API
}
已验证=正确;
}     
产生返回验证结果。成功;
}
}       
用于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);
}
[ResponseType(typeof(Class1))]
公共异步任务后类别1(类别1)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
db.Class1.Add(Class1);
等待db.saveChangesSync();
返回CreatedAtRoute(“DefaultApi”,new{id=Class1.id},Class1);
}
当从类2中的Validate方法调用外部API时,我希望包含classprop的值。 我试图找到一种方法来做到这一点,也寻找了一种方法,但可以找到一个。 尽可能多地保留模型的结构。
我希望我的问题有意义,如果没有记录在案,我会感到抱歉

classdata
中引用
Class1.classprop
可能需要某种委托:

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;
    }
}
在验证之前可以调用该方法:

    [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);
    }
[ResponseType(typeof(Class1))]
公共异步任务后类别1(类别1)
{
class1.ParentLookup();
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
db.Class1.Add(Class1);
等待db.saveChangesSync();
返回CreatedAtRoute(“DefaultApi”,new{id=Class1.id},Class1);
}
    [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);
    }