Validation 从对象验证器获取对完整json的访问

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<

我的web API公开了以下方法

[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;
    }
}