2017-01-11 22 views
0

Ich bin neu bei MVC und ich entwickle eine Self-Service-Anwendung für unsere Kunden bei der Arbeit, die sie mit ihrem clientcode und Passwort anmelden, ich verwendet asp.net Identität mit DBContext und es geschafft, ein benutzerdefiniertes Profilfeld zu erstellen, das ClientCode ist und funktioniert gut, aber ich muss dieses Feld so einzigartig machen, dass nur ein ClientCode in der Benutzerdatenbank existiert, dachte ich vielleicht, dies bei der Registrierung eines neuen Kontos zu überprüfen, nicht sicher, wie Ich kann diese Einschränkung implementieren;Einzigartiges benutzerdefiniertes Profilfeld asp.net identity MVC5

Mein Account Register-Methode

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

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

Antwort

1

Sie etwas tun könnte so einfach wie:

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

Dann in Ihrem Controller Sie dies als anrufen:

[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 das ist genau das, was ich suche, aber ich änderte die Art, wie ich meine Client-Codes zur Liste hinzufügen durch Ersetzen der zwei Zeilen ClientCodeList.Add (100), ClientCodeList.Add (200) mit clientCodesList = context.Users.Select (u => u.ClientCode) .ToList(); Aber es erstellt immer noch einen doppelten Client-Code – Trev

+0

Ok, ich habe es endlich geschafft, es funktionieren zu lassen, indem ich zu if (clientCodeExists == false) ändere – Trev