首页 > 解决方案 > 如何在访问数据库的服务器端进行自定义验证?

问题描述

我在控制器中创建了一个方法,以便可以使用远程属性在客户端验证用户名:

    [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; }
    }

在搜索有关堆栈溢出的其他问题后,我没有遇到在服务器上验证相同条件的方法。使用 !ModelState.IsValid 不考虑远程属性,我正在寻找一个更好的解决方案,而不是在实际的 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 });
    }

我不认为创建自定义验证属性是一种选择,因为我将无法注入 userManager。任何帮助将不胜感激!

标签: c#asp.net-corevalidation

解决方案


如果您的问题是您不知道如何将所需的服务注入自定义属性,本文将为您提供帮助

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


推荐阅读