Отключить проверку модели [обязательно] в ASP.NET Web API

#c# #asp.net #asp.net-web-api #model-validation

#c# #asp.net #asp.net-web-api #модель-проверка

Вопрос:

Итак, в основном у меня есть два класса: Model и DTO, Model будет использоваться для обработки API, в то время как DTO будет обрабатывать базу данных (Firestore).

У меня есть модель Company, в этой модели название компании требуется, когда я выполняю запрос CreateCompany POST.

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

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

Это модель Employee, которую я использовал для создания сведений о сотруднике, и в этом классе будет использоваться модель компании.

 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 Компания.Для CompanyName ранее было установлено значение [Обязательно], и это сделало обязательным заполнение Employee.company.Название компании также.

Итак, я подумал, есть ли какой-либо способ отключить проверку модели во время выполнения запроса CreateEmployee POST. Или, может быть, я должен включить проверку модели только во время запроса CreateCompany POST?

Ответ №1:

Вы можете создать пользовательский атрибут проверки, который проверяет, CompanyName на основе того, Company является ли это внутренним свойством или моделью верхнего уровня

 [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” );