繁体   English   中英

使用ASP.NET Web Api时如何检查电话号码在AspNetUsers表中是否唯一

[英]How to check phone number is unique in AspNetUsers table when using ASP.NET Web Api

我创建了一个Asp.Net Web Api项目并使用了个人用户帐户。 当我将用户添加到表中时,默认系统会自动检查表中是否已存在提供的电子邮件地址,如果存在,则会引发错误的请求,否则可以提交用户。

我还如何检查电话号码是否唯一并且尚未提交到表中?

// POST api/Account/Register
        [AllowAnonymous]
        [Route("Register")]
        public async Task<IHttpActionResult> Register(RegisterBindingModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            **using (ApplicationDbContext db = new ApplicationDbContext())
            {
                var foundPhoneNumber = await db.Users.FirstOrDefaultAsync(x => x.PhoneNumber.Equals(model.PhoneNumber));

                if (foundPhoneNumber != null)
                {
                    return BadRequest("Phone number already exists");
                }
            }**

            var user = new ApplicationUser()
            {
                UserName = model.Email,
                Email = model.Email,
                PhoneNumber = model.PhoneNumber,
                FirstName = model.FirstName,
                LastName = model.LastName,
                MemberNumber = model.MemberNumber,
                CarReg = model.CarReg
            };

            IdentityResult result = await UserManager.CreateAsync(user, model.Password);

            if (!result.Succeeded)
            {
                return GetErrorResult(result);
            }

            return Ok();
        }

我已查询数据库以检查是否存在具有相同号码的电话号码。 这可行,但是有更好的方法吗?

修改您的ApplicationUser调用并添加以下属性。

public class ApplicationUser : IdentityUser
{
    [MaxLength(17)]
    [IsUnique]
    public string PhoneNumber { get; set; }
}

您可以在ApplicationUserDbContext类中重写ValidateEntity方法,它将在SaveChanges方法上触发。

protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
        {
            if (entityEntry != null && entityEntry.State == EntityState.Added)
            {
                var errors = new List<DbValidationError>();
                ////User Validation
                if (entityEntry.Entity is ApplicationUser user)
                {
                    if (this.Users.Any(u => string.Equals(u.PhoneNumber, user.PhoneNumber)))
                    {
                        errors.Add(new DbValidationError("User",
                          string.Format($"Phonenumber {user.PhoneNumber} is already taken")));
                    }
                }

                if (errors.Any())
                {
                    return new DbEntityValidationResult(entityEntry, errors);
                }
            }
            return new DbEntityValidationResult(entityEntry, new List<DbValidationError>());
        }

可以通过添加到模型上的PhoneNumber属性的自定义ValidationAttribute来添加验证 这是一个简单的示例:

   [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
   public class NotABananaAttribute : ValidationAttribute
   {
    public override bool IsValid(object value)
    {
        var inputValue = value as string;
        var isValid = true;

        if (!string.IsNullOrEmpty(inputValue))
        {
            isValid = inputValue.ToUpperInvariant() != "BANANA";
        }

        return isValid;
    }
   }

它使用喜欢...

public class Model
{
    [NotABanana(ErrorMessage = "Bananas are not allowed.")]
    public string FavoriteFruit { get; set; }
}

示例来源: https//riptutorial.com/csharp/example/18486/creating-a-custom-validation-attribute

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM