首页 > 解决方案 > 在 asp.net core 2.2 中使用远程验证的问题

问题描述

我正在尝试使用控制器上或控制器中PhoneNumber的远程属性检查身份的唯一性,但似乎无法正常工作并且触发DTOModelApisqlException

我在 Api 文件夹中,但我尝试在默认控制器文件夹中AuthController单独使用ValidatorController

我使用了 Microsoft 文档中建议的 Remote 属性约定

// My Dto
namespace Imah.Api.API.Dto.Requests
{
    public class PasswordlessLoginRequest
    {        
        public User User { get; set; }

        [Required(ErrorMessage = "the phone number is empty")]
        [Remote(action: "IsPhoneNumberExist", controller: "Auth")]
        public string PhoneNumber { get; set; }
    }
}

// User Model
public class User : IdentityUser<int>, ITrackable
    {
        [Remote(action: "IsPhoneNumberExist", controller: "Auth")]
        public override string PhoneNumber { get; set; }

    }

// AuthController
[AllowAnonymous]
    public class AuthController : ApiControllerBase
    {


public AuthController(AuthService authService, SignInManager<User> signInManager,
            IConfiguration config, UserManager<User> userManager,
        IMapper mapper, INotificationService notifyService, IUserRepository repo)
        {

        }



        [HttpPost("register")]        
        public async Task<IActionResult> Register(
            PasswordlessLoginRequest userForRegisterDto)
        {


                var user = new User { PhoneNumber = userForRegisterDto.PhoneNumber };

                RegisterParams registerParams = new RegisterParams
                {
                    User = user,
                };

                var code = await _authService.Register(registerParams);
                var userToReutrn = _mapper.Map<UserForListDto>(user);
                if (code != null)
                {

                    // Send authCode to user
                    _notifyService.Notify(user, code);

                    return Ok(userToReutrn);
                }

            return BadRequest("Error");


        }

public IActionResult IsPhoneNumberExist([Bind(Prefix = "User.PhoneNumber")]string PhoneNumber)
        {
         return Json(data: $"A user phone number {PhoneNumber} already exists.");

           //var user = _repo.GetUserByPhone(PhoneNumber).Result;
           //if (user != null)
           //{
           // return Json(data: $"A user phone number {PhoneNumber} already exists.");
           //}
           //else
           //{
            //     return Json(data: true);
            //}
        }
}

标签: c#asp.net-core

解决方案


这不是远程验证的问题。问题是你没有完全理解远程验证是什么,或者做什么。

远程验证是一种客户端验证技术,它调用服务器上的操作方法来执行验证。

远程验证的一个常见示例是检查用户名在用户提交数据时必须唯一的应用程序中是否可用,并执行客户端验证。

当用户填写一个Remote属性在视图中具有该属性的模型时,远程验证在后台执行。用户不必单击提交按钮,然后等待呈现新视图并返回可能的错误消息,说明输入的用户名已被使用。相反,它向服务器发出一个轻量级的 Ajax 请求,以验证是否使用了用户名,然后返回一个真/假值,客户端 jQuery 验证器将使用该值向用户显示他们输入了重复的用户名。


推荐阅读