Как уведомить пользователей для пользовательской проверки на основе нескольких свойств - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь создать пользовательскую проверку сообщения, которая включает два или более атрибута.

Вот упрощенная версия моего DTO:

public class FooDTO
{
    public int Id { get; set; }
    public int Name { get; set; }
    //more attributes...

    public bool IsValid 
    {
        get
        {                                
            if (string.IsNullOrEmpty(this.Name) && (this.Id == 0))
                return false; //You will have to specify at least one of the following: Id or Name
            if (this.Name == "Boo" && this.ID = 999)
                return false;  //Boo name and Id of 99 are forbidden 
            //More validation ifs.

            return true;
        }
    }
}

И моя текущая реализация контроллера выглядит например:

public async Task<IActionResult> DoSomething(FooDTO fooDTO)
{            
    if (!FooDTO.IsValid)
        return BadRequest(""); 
    // Rest of code        
}

Эта реализация не подтверждает пользователя соответствующим сообщением, например, когда отсутствуют и Id, и Name, я хочу, чтобы пользователь был уведомлен с чем-то вроде "Вы нужно будет указать хотя бы одно из следующего: Id or Name "ошибка проверки.

Есть ли способ использовать ValidationAttribute для проверки двух или более свойств, включающих сложную проверку? (это мое предпочтительное решение)

Или элегантный способ создания настраиваемого сообщения об ошибке для отправки при перегрузке BadRequest(string message)?

1 Ответ

2 голосов
/ 06 апреля 2020

Использование может использовать IValidatableObject для реализации пользовательской проверки:

public class FooDTO : IValidatableObject
{
    public int Id { get; set; }

    public string Name { get; set; }
    //more attributes...

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (string.IsNullOrEmpty(Name) && (Id == 0))
            yield return new ValidationResult("You will have to specify at least one of the following: Id or Name", new[] { "Id", "Name" });

        if (Name == "Boo" && Id == 999)
            yield return new ValidationResult("Boo name and Id of 99 are forbidden", new[] { "Id", "Name" });
    }
}

и в контроллере:

public async Task<IActionResult> DoSomething(FooDTO fooDTO)
{            
    if (!ModelState.IsValid)
        return BadRequest(ModelState); 

    // Rest of code        
}

Для получения дополнительной информации прочитайте Проверка модели в ASP. NET Core MVC и Razor Pages

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...