Отключить проверку модели [обязательно] в ASP.NET Web API - PullRequest
1 голос
/ 13 марта 2019

Таким образом, в основном у меня есть два класса, это 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; }
}

Теперь проблема в том, что когда я сделал POST-запрос CreateEmployee, мне нужно будет заполнить только Employee.company.CompanyId , но, поскольку в модели Company, Company.CompanyName * ранее установил [Обязательный] и обязательный для заполнения Employee.company.CompanyName .

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

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

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

[AttributeUsage(AttributeTargets.Class)]
public class RequierdCompanyNameAttribute: 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);
    }
}

И использование

[RequierdCompanyName]
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; }
}
0 голосов
/ 14 марта 2019

Удалите оскорбительное свойство из ModelState

ModelState.Remove( “Company.CompanyName” );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...