2016-10-01 3 views
1

Ich benutze Datenbank zuerst und ich validiere meine Eingaben über ViewModel. Ich möchte jedoch überprüfen, ob entweder bereits in db übernommen wird. Wie mache ich das? Dies ist, wie weit konnte ich bekommen (ich kann bestätigen und speichern):MVC - Wie überprüft man, ob der Benutzername nicht bereits vergeben ist?

[Required] 
[StringLength(50)] 
[MinLength(3, ErrorMessage = "You must at least have 3 letters")] 
public string UserName { get; set; } 

und das folgende ist mein Register Code in Controller:

[HttpGet] 
    public ActionResult Register() { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Register(UserVIewModel reg) { 
     if (ModelState.IsValid) 
     { 
      var m = new User { 
       UserName = reg.UserName, 
       Email = reg.Email, 
       FirstName = reg.FirstName, 
       LastName = reg.LastName, 
       Password = reg.Password 
      }; 

      db.Users.Add(m); 
      db.SaveChanges(); 

      return RedirectToAction("Login"); 

     } 
     return View(); 
    } 

Antwort

4

Dies ist, wie Sie überprüfen Sie können Benutzer innerhalb Register() -Methode

[HttpPost] 
public ActionResult Register(UserVIewModel reg) { 
    if (ModelState.IsValid) 
    { 

     if (db.Users.Where(u => u.UserName == reg.UserName).Any()) 
     { 
      //Do what do u need to do... 
     } 
     else 
     { 
      var m = new User { 
      UserName = reg.UserName, 
      Email = reg.Email, 
      FirstName = reg.FirstName, 
      LastName = reg.LastName, 
      Password = reg.Password 
      }; 

      db.Users.Add(m); 
      db.SaveChanges(); 

      return RedirectToAction("Login"); 
     } 
    } 
    return View(); 
} 
+0

Genau das, was ich für dank gesucht. Übrigens, gibt es eine gute Möglichkeit, eine "Validierungsnachricht" zurückzugeben? – Nyprez

+0

Es gibt viele Möglichkeiten. Eine Möglichkeit besteht darin, die Überprüfungsmeldung in ViewBag zu setzen, um sie in der Ansicht einem visuellen Steuerelement zuzuordnen. Sie können für Beispiel google. – RajN

+0

Ah danke, es hat funktioniert :) – Nyprez

1

Dadurch wird der erste Eintrag in der DB-Abfrage und geben die Kriterien oder null passend

Also ich würde nur prüfen, ob die Abfrage einen Wert oder null zurückgibt und legen Sie einen Bool (siehe Code unten)

Anmerkung der x, Sie einen anderen Buchstaben oder ein Wort verwenden können. vielleicht data => data.UserName.... oder row => row.UserName... oder result => result.UserName..., es stellt nur das Modell für die db

so etwas wie dies (den Code ein bisschen auch neu geordnet)

[HttpPost] 
public ActionResult Register(UserVIewModel reg) { 
    if (!ModelState.IsValid) 
    { 
     return View(model); 
    } 

    // here is the main answer to your question 
    bool userExists = db.Users.FirstOrDefault(x => x.UserName == reg.UserName) != null; 

    // and then use the bool to see if you need to return an error 
    if (userExists) { 
     // I'm not 100% sure about this part so double-check this 
     // but I think it's pretty close to this 
     ModelState.AddModelError("UserName","UserName taken"); 
     return View(model); 
    } 


    // If the userExists = false then code continues here 
    var m = new User { 
     UserName = reg.UserName, 
     Email = reg.Email, 
     FirstName = reg.FirstName, 
     LastName = reg.LastName, 
     Password = reg.Password 
    }; 

    db.Users.Add(m); 
    db.SaveChanges(); 

    return RedirectToAction("Login"); 
} 
+0

'db.Users.Where (u => u.UserName == reg.UserName) .Any()' das, dass @raj in seine Antwort steckt, ist besser als das Erstellen der Bool, aber das Konzept ist das gleiche – Francisc0

Verwandte Themen