Как выполнить пользовательскую проверку на стороне сервера с доступом к базе данных?

#c# #asp.net-core #validation

Вопрос:

Я создал метод в контроллере, чтобы я мог использовать атрибут remote для проверки имени пользователя на стороне клиента:

     [HttpGet]
    [HttpPost]
    [Authorize]
    public async Task<IActionResult> IsUsernameValidInput(string username)
    {
        string userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
        ApplicationUser user = await userManager.FindByNameAsync(username);

        if (user == null)
        {
            return Json($"Username {username} does not exist.");
        }
        else if (user.Id == userId)
        {
            return Json("Cannot add own username.");
        }

        return Json(true);
    }
 

Это входная модель:

     public class ProjectUserInputModel
    {
    [Required]
    public int ProjectId { get; set; }

    [Required]
    public string ProjectGuid { get; set; }
    
    [Required(ErrorMessage = "Username is required.")]
    [Remote("IsUsernameValidInput", "Project")]
    public string Username { get; set; }

    [Required]
    public bool IsCollaborator { get; set; }
    }
 

После поиска других вопросов по переполнению стека я не нашел способа проверить те же условия на сервере. Используя !Состояние модели.isValid не учитывает атрибут remote, и я ищу лучшее решение, чем просто жесткое кодирование той же проверки в фактическом методе post.

     [HttpPost]
    [Authorize]
    public async Task<IActionResult> AddUser(ProjectUserInputModel inputModel)
    {
        if (!ModelState.IsValid)
        {
            return RedirectToAction("Error", "Home");
        }

        ApplicationUser user = await userManager.FindByNameAsync(inputModel.Username);
        await projectUserService.AddUserToProjectAsync(inputModel.ProjectId, user.Id, inputModel.IsCollaborator);

        return RedirectToAction("Current", new { guid = inputModel.ProjectGuid });
    }
 

Я не думаю, что создание пользовательского атрибута проверки является опцией, потому что я не смогу ввести пользовательский менеджер. Любая помощь будет оценена по достоинству!

Ответ №1:

Эта статья поможет вам, если ваша проблема заключается в том, что вы не знаете, как внедрить нужные службы в пользовательский атрибут

https://andrewlock.net/injecting-services-into-validationattributes-in-asp-net-core/