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