2017-01-11 3 views
0

Я новичок в MVC, и я разрабатываю приложение самообслуживания для наших клиентов на работе, в котором они будут входить в систему, используя свой клиентский код и пароль, я использовал идентификатор asp.net с DBContext и удалось создать настраиваемое поле профиля, которое является ClientCode, и работает отлично, но мне нужно сделать это поле уникальным, чтобы в базе данных пользователей существовал только один ClientCode, я думал, возможно, проверить это при регистрации новой учетной записи, не знаете, как Я могу реализовать это ограничение;Уникальное настраиваемое поле профиля asp.net identity MVC5

Мой AccountController Регистрация метод

[HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Register(RegisterViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = new ApplicationUser { UserName = model.Email, Email = model.Email, ClientCode = model.ClientCode }; 

      var result = await UserManager.CreateAsync(user, model.Password); 
       if (result.Succeeded) 
       { 
        await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); 

        // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771 
        // Send an email with this link 
        // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); 
        // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); 
        // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>"); 

        return RedirectToAction("ClientsHome", "Home"); 
       } 
       AddErrors(result); 
     } 
     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

Мои AccountViewModel RegisterViewModel

public class RegisterViewModel 
{ 
    [Required] 
    [Display (Name = "Client Code")] 
    public long ClientCode { get; set; } 

    [Required] 
    [EmailAddress] 
    [Display(Name = "Email")] 
    public string Email { get; set; } 

    [Required] 
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [DataType(DataType.Password)] 
    [Display(Name = "Confirm password")] 
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] 
    public string ConfirmPassword { get; set; } 
} 

ответ

1

Вы могли бы сделать что-то просто:

public bool ClientCodeExists(long clientCode) 
{ 
    //you will get values from your db. I've used this as a simple exmaple. 
    List<long> clientCodesList = new List<long>(); 

    clientCodesList.Add(100); 
    clientCodesList.Add(200); 

    return clientCodesList.Any(a => a == clientCode); 
} 

Тогда в контроллере вы можете назвать это как:

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Register(RegisterViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     long clientCode = model.ClientCode; 
     bool clientCodeExists = ClientCodeExists(clientCode); 

     if(clientCodeExists) 
     { 
      //setup app user, create identity etc 
     } 
     else 
     { 
      ModelState.AddModelError("", "Error message you want to show to end user."); 
     } 
    } 
} 
+0

Thanx это именно то, что я ищу, но я изменил способ добавления кодов клиентов в список, заменив две строки ClientCodeList.Add (100), ClientCodeList.Add (200) с помощью clientCodesList = context.Users.Select (u => u.ClientCode) .ToList(); Но он по-прежнему создает дубликат кода клиента – Trev

+0

Хорошо, мне удалось заставить его работать, изменив значение на if (clientCodeExists = false) – Trev

Смежные вопросы