6

Korzystanie Visual Studio 2013,4 (Visual Studio 2013 Update 4) Stworzyłem regularne ASP.NET MVC 5 projekt z Indywidualne Konta użytkowników konfigurację uwierzytelniania. Wszystkie funkcje rejestracji i logowania użytkowników zostały już przeze mnie przygotowane przez Visual Studio i działają dobrze.Jak sprawdzić, czy użytkownik już istnieje po stronie klienta w ASP.NET MVC 5?

W jaki sposób zaimplementować walidację po stronie klienta następującej reguły na stronie rejestracji: Brak zarejestrowanego użytkownika z tym samym adresem e-mail?

Odpowiedz

11

Można użyć RemoteAttribute do wykonania sprawdzania poprawności strony klienta za pomocą wywołania zwrotnego serwera.

1) Dodaje się metodę do AccountController:

[AllowAnonymous] 
public async Task<JsonResult> UserAlreadyExistsAsync(string email) 
{ 
    var result = 
     await userManager.FindByNameAsync(email) ?? 
     await userManager.FindByEmailAsync(email); 
    return Json(result == null, JsonRequestBehavior.AllowGet); 
} 

2) Dodaj Remote atrybut Email własność RegisterViewModel klasy:

[Remote("UserAlreadyExistsAsync", "Account", ErrorMessage = "User with this Email already exists")] 
public string Email { get; set; } 

gdzie "Account" jest nazwą kontrolera podawania i "UserAlreadyExistsAsync" to nazwa działania.

+2

Warto również czytanie [Jak: wdrożenie zdalnego walidacji w ASP.NET MVC] (https://msdn.microsoft. com/en-us/library/gg508808% 28VS.98% 29.aspx) –

+0

Dokładnie tego szukałem, ale nie działa z biblioteką twitterbootstrapmvc '@ Html.Bootstrap(). TextBoxFor (t => t. Email) .Placeholder ("Adres e-mail"). ShowValidationMessage (true) ' * // jak mogę sprawdzić/wywołać po stronie klienta tutaj z biblioteką hellperową twitterbootstrapmvc *' @ Html.ValidationMessageFor (t => t.Email) ' – aggie

+0

Co powinno Robię, jeśli chcę sprawdzić nazwę użytkownika tylko w operacji zapisu, a nie w operacji aktualizacji. – Hemal

0

To pomogło dużo. W moim przypadku był to stół, w którym możliwe były również aktualizacje. W takim przypadku powyższe rozwiązanie nie działa. Dlatego chciałem podzielić się moim rozwiązaniem w tej sprawie.

W poniższym rozwiązaniu dodałem dodatkowe pole do przekazania do kontrolera (klucz podstawowy modelu). Następnie w kontrolerze sprawdzam, czy klucz podstawowy jest podany. Jeśli tak, to wiemy, że pochodzimy z witryny aktualizacji, ponieważ jest to jedyny przypadek, w którym mamy już identyfikator w modelu. Ostatnim krokiem jest sprawdzenie, czy ciąg znaków i klucz podstawowy są takie same. Jeśli oba są, jest OK, ponieważ nie zmieniliśmy niczego w ciągu znaków. Jeśli tylko ciąg znaków jest taki sam, ale nie identyfikator, oznacza to, że zmieniliśmy ciąg i zmieniliśmy go na inny istniejący ciąg znaków, więc zwracamy wartość false.

Model:

[Key] 
    [Display(Name = "Idee ID")] 
    public int intIdeaID { get; set; } 

    [Required(ErrorMessage = "Dieses Feld muss ausgefüllt werden")] 
    [Display(Name = "Idee")] 
    [Remote("ideaExists", "TabIdea", HttpMethod = "POST", ErrorMessage = "Es wurde bereits eine Idee mit dieser Bezeichnung erstellt", AdditionalFields = "intIdeaID")] 
    public string strIdea { get; set; } 

Kontroler:

[HttpPost] 
public JsonResult ideaExists(string strIdea, int? intIdeaID) 
{ 
    if (intIdeaID != null) 
    { 
     if (db.tabIdea.Any(x => x.strIdea == strIdea)) 
     { 
      tabIdea existingTabIdea = db.tabIdea.Single(x => x.strIdea == strIdea); 
      if (existingTabIdea.intIdeaID != intIdeaID) 
      { 
       return Json(false); 
      } 
      else 
      { 
       return Json(true); 
      } 
     } 
     else 
     { 
      return Json(true); 
     } 
    } 
    else 
    { 
     return Json(!db.tabIdea.Any(x => x.strIdea == strIdea)); 
    } 
} 
Powiązane problemy