使用IValidatableObject进行验证时,引用模型类的C#/MVC/实体访问属性
我已经创建了一个WebAPI web应用程序,我正在通过实现IValidatableObject来验证数据。根据验证结果,调用外部API并保存数据(无论模型是否有效)。 我已经创建了调用外部API的逻辑 我的模型具有以下结构:使用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
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);
}