Validation 从对象验证器获取对完整json的访问
我的web API公开了以下方法Validation 从对象验证器获取对完整json的访问,validation,.net-core,asp.net-core-webapi,Validation,.net Core,Asp.net Core Webapi,我的web API公开了以下方法 [HttpPost] public IActionResult MyPostMethod([FromBody]Company company) { ....... } 公司类如下所示 public class Company { public Guid CompanyGuid { get; set; } public string Name { get; set; } public List<
[HttpPost]
public IActionResult MyPostMethod([FromBody]Company company)
{
.......
}
公司类如下所示
public class Company
{
public Guid CompanyGuid { get; set; }
public string Name { get; set; }
public List<Employee> Employees { get; set; }
}
[EmployeeValidation]
public class Employee
{
public Guid EmployeeGuid { get; set; }
public string Name { get; set; }
}
上市公司
{
公共Guid公司Guid{get;set;}
公共字符串名称{get;set;}
公共列表雇员{get;set;}
}
[员工确认]
公营雇员
{
公共Guid EmployeeGuid{get;set;}
公共字符串名称{get;set;}
}
正如您所看到的,Employee类由验证属性修饰,其实现如下
public class EmployeeValidationAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var logger = (ILogger<EmployeeValidationAttribute>)validationContext.GetService(typeof(ILogger<EmployeeValidationAttribute>));
List<Employee> Employees = (List<Employee>)validationContext.ObjectInstance;
foreach (Employee Employee in Employees)
{
if (Employee.EmployeeGuid == Guid.Empty)
{
return new ValidationResult("Invalid Employee Guid");
}
}
return ValidationResult.Success;
}
}
公共类EmployeeValidationAttribute:ValidationAttribute
{
受保护的重写ValidationResult有效(对象值,ValidationContext ValidationContext)
{
var logger=(ILogger)validationContext.GetService(typeof(ILogger));
List Employees=(List)validationContext.ObjectInstance;
foreach(员工中的员工)
{
if(Employee.EmployeeGuid==Guid.Empty)
{
返回新的ValidationResult(“无效的员工Guid”);
}
}
返回ValidationResult.Success;
}
}
假设当Employee对象的验证出现问题时,我想将整个JSON输入记录到MyPostMethod方法中。但是在验证器中,我只能访问Employee对象。我是否可以在员工对象的验证程序中访问公司的JSON输入 您需要构建公司验证属性,而不仅仅是员工验证属性
[CompanyValidation]
public class Company
{
public String CompanyGuid { get; set; }
public string Name { get; set; }
public List<Employee> Employees { get; set; }
}
public class CompanyValidationAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var logger = (ILogger<CompanyValidationAttribute>)validationContext.GetService(typeof(ILogger<CompanyValidationAttribute>));
var company = (Company)validationContext.ObjectInstance;
// don't forget to check for null
foreach (Employee Employee in company.Employees)
{
if (Employee.EmployeeGuid == Guid.Empty)
{
return new ValidationResult("Invalid Employee Guid");
}
}
return ValidationResult.Success;
}
}
我想我的问题是要知道,如果有可能进入验证程序,我就可以访问完整的JSON对象。我知道我可以为根对象创建一个验证器,并在那里验证所有包含的对象(就像您为公司验证器建议的那样),但这不是我想要实现的。此外,当验证器属性报告验证错误时,请求似乎不会向Post方法发出。@Jimcrown好的,我明白了。。。我没有发现类级验证属性提供了它的容器对象,但是属性级验证属性提供了它的容器对象,不知道为什么。。。如果post未绑定到操作的参数,则必须查看asp.net mvc模型绑定功能的命名约定。
public class MyController : Controller
{
[HttpPost]
public object Post([FromBody]Company company)
{
if (!ModelState.IsValid)
{
//log here
}
return true;
}
}
public class Company
{
[GuidValidation]
public Guid CompanyGuid { get; set; }
public String Name { get; set; }
public List<Employee> Employees { get; set; }
}
public class Employee
{
[GuidValidation]
public Guid EmployeeGuid { get; set; }
public String Name { get; set; }
}
public class GuidValidationAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value != null && validationContext.ObjectInstance != null)
{
var model = (Guid)value;
if (model == Guid.Empty)
{
return new ValidationResult("Guid cannot be empty.");
}
}
return ValidationResult.Success;
}
}