c# - 如何在访问数据库的服务器端进行自定义验证?
问题描述
我在控制器中创建了一个方法,以便可以使用远程属性在客户端验证用户名:
[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。任何帮助将不胜感激!
解决方案
如果您的问题是您不知道如何将所需的服务注入自定义属性,本文将为您提供帮助
https://andrewlock.net/injecting-services-into-validationattributes-in-asp-net-core/
推荐阅读
- python - Aiogram python InlineKeyboard
- c - 如何在一个结构中定义一个结构并重复使用相同的名称两次?
- java - Micronaut 和 Gradle 无法进行测试
- telegram - 是否可以使用电报机器人内联按钮来获取用户实时位置?
- php - 从 php 在命名管道上运行 shell 命令
- sql - SQL 拆分总计
- linux - org.eclipse.swt.SWTError: 没有更多句柄 [gtk_init_check() failed]
- html - 视频不会在移动 Safari 和 Firefox 上自动播放
- data-structures - 将节点值向有根树中的根节点求和
- purescript - 类型变量 r 已超出其范围