#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/