【问题标题】:Disable Model Validation [Required] in ASP.NET Web API在 ASP.NET Web API 中禁用模型验证 [必需]
【发布时间】:2019-03-13 18:39:14
【问题描述】:

所以基本上我有两个类,即 Model 和 DTO,Model 将用于处理 API,而 DTO 将处理数据库(Firestore)。

我有一个 Company 模型,在这个模型中,我在执行 CreateCompany POST 请求时需要 CompanyName。

public class Company
{
    public string CompanyId { get; set; }

    [Required]
    public string CompanyName { get; set; }
}

这是我用来创建员工详细信息的Employee模型,该类中将使用Company模型。

public class Employee
{
    public string EmployeeId { get; set; }

    public bool? IsFirstLogin { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    [EmailAddress]
    public string PaypalEmail { get; set; }

    [Required]
    [Phone]
    public string PhoneNumber { get; set; }

    public Company company { get; set; }
}

现在的问题是当我发出 CreateEmployee POST 请求时,我只需要填写 Employee.company.CompanyId,但是因为在 Company 模型中,Company. CompanyName 之前已设置为 [Required],并且必须同时填写 Employee.company.CompanyName

所以我在考虑是否有任何方法可以在发出 CreateEmployee POST 请求期间禁用模型验证。或者我应该只在 CreateCompany POST 请求期间启用模型验证?

【问题讨论】:

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


    【解决方案1】:

    您可以根据Company 是内部属性还是顶级模型来创建自定义验证属性来验证CompanyName

    [AttributeUsage(AttributeTargets.Class)]
    public class RequiredCompanyNameAttribute: RequiredAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            //validate if top level model
            if (validationContext.ObjectType == typeof(Company))
                return base.IsValid(value, validationContext);
    
            //no validation inside Employee
            return ValidationResult.Success;
        }
    
        public override bool IsValid(object value)
        {
            Company company = (Company)value;
            //validate CompanyName with RequiredAttribute
            return base.IsValid(company.CompanyName);
        }
    }
    

    及用法

    [RequiredCompanyName]
    public class Company
    {
        public string CompanyId { get; set; }
    
        public string CompanyName { get; set; }
    }
    

    但最简单的方法是为此目的引入不同的模型

    public class Company
    {
        public string CompanyId { get; set; }
    
        [Required]
        public string CompanyName { get; set; }
    }
    
    public class EmployeeCompany
    {
        [Required]
        public string CompanyId { get; set; }
    
        public string CompanyName { get; set; }
    }
    
    public class Employee
    {
        //..
    
        public EmployeeCompany Company { get; set; }
    }
    

    【讨论】:

      【解决方案2】:

      从 ModelState 中删除有问题的属性

      ModelState.Remove( “Company.CompanyName” );
      

      【讨论】:

        猜你喜欢
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-27
        • 1970-01-01
        • 2014-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多