2017-08-31 2 views
-1

Ich bin nur ein Anfänger von ASP.NET MVC. Ich habe gerade mit dem Erstellen meiner Login-Seite begonnen, es funktioniert gut, aber ich habe ein Problem, wenn der Benutzer falsche Anmeldeinformationen eingibt. Dies ist, was ich getan habe:ASP.NET MVC: ModelState Fehlermeldung wird nicht angezeigt

Userprofile

public partial class UserProfile 
    { 
     public int UserId { get; set; } 
     [Display(Name = "User name")] 
     [Required(ErrorMessage = "Username is required.")] 
     public string UserName { get; set; } 
     [Display(Name = "Password")] 
     [DataType(DataType.Password)] 
     [Required(ErrorMessage = "Password is required.")] 
     public string Password { get; set; } 
     public bool IsActive { get; set; } 
    } 

Homecontroller:

public class HomeController : Controller 
{ 
    public ActionResult Login() 
    { 
     return View(); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Login(UserProfile objUser) 
    { 
     if (ModelState.IsValid) 
     { 
      using (DB_Entities db = new DB_Entities()) 
      { 
       var obj = db.UserProfiles.Where(a => a.UserName.Equals(objUser.UserName) && a.Password.Equals(objUser.Password)).FirstOrDefault(); 
       if (obj != null) 
       { 
        Session["UserID"] = obj.UserId.ToString(); 
        Session["UserName"] = obj.UserName.ToString(); 
        return RedirectToAction("UserDashBoard"); 
       } 
      } 
     } 
     else 
     { 
      ModelState.AddModelError("", "Invalid Credentials"); 
     } 
     return View(objUser); 
    } 

    public ActionResult UserDashBoard() 
    { 
     if (Session["UserID"] != null) 
     { 
      return View(); 
     } 
     else 
     { 
      return RedirectToAction("Login"); 
     } 
    } 
} 

Und die Ansicht

@model MyWebApplication.Models.UserProfile 

@{ 
    ViewBag.Title = "Login"; 
} 

@using (Html.BeginForm("Login", "Home", FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     <div class="form-group"> 
      @Html.LabelFor(model => model.UserName, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.UserName, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.UserName, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Login" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 


@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

Ich bin mir nicht sicher, warum die Meldung "Ungültige Anmeldeinformationen" nicht angezeigt wird, wenn der Benutzer einen Benutzernamen eingibt, der nicht in der Datenbank gespeichert ist.

+0

Es wird nicht angezeigt, da der Fluss Ihres Programms den Modellstatusfehler nicht festlegt, wenn die Anmeldeinformationen ungültig sind. Sie legen den Fehler nur fest, wenn 'ModelState.IsValid' falsch ist. Wenn dies der Fall ist, authentifizieren Sie den Benutzer, geben aber keinen Fehler zurück, wenn dieser ungültig ist. –

+0

Unter keinen Umständen speichern Sie jemals ein Passwort in einer Datenbank als einfachen Text - Ihre Hash (und Salz) sie. Und ich schlage Ihre Arbeit dennoch vor [Sicherheit, Authentifizierung und Autorisierung] (https://www.asp.net/mvc/overview/security) –

Antwort

1

In Ihrer Frage geben Sie nicht an, ob oder nicht in Ihrer if Aussage, wenn die Linie ModelState.AddModelError("", "Invalid Credentials"); getroffen wird, was ich bezweifle, dass es ist.

Ihre if Anweisung ist falsch aufgebaut, weil Sie ab jetzt nur den Invalid Credentials Fehler anzeigen möchten, wenn der ModelState nicht gültig ist .. nicht, ob die Anmeldeinformationen des Benutzers vorhanden sind oder nicht.

So müssen Sie Ihr if-Anweisung, dies zu umschreiben:

if (ModelState.IsValid) 
{ 
    using (DB_Entities db = new DB_Entities()) 
    { 
     var obj = db.UserProfiles.Where(a => a.UserName.Equals(objUser.UserName) && a.Password.Equals(objUser.Password)).FirstOrDefault(); 
     if (obj != null) 
     { 
      Session["UserID"] = obj.UserId.ToString(); 
      Session["UserName"] = obj.UserName.ToString(); 
      return RedirectToAction("UserDashBoard"); 
     }  
     else 
     { 
      ModelState.AddModelError("", "Invalid Credentials"); 
     } 
    } 
} 

nicht wählerisch sein, aber hoffentlich Ihre UserName Eigenschaft ist einzigartigen, denn wenn Sie 2 Benutzer, die exakt die gleichen UserName haben und Password und Sie erhalten die FirstOrDefault Vorkommen, dann könnten Sie möglicherweise einen Benutzer mit anderen Anmeldeinformationen anmelden. So würde ich sicherstellen, dass die UserName Eigenschaft einzigartig ist und ändern Sie FirstOrDefault zu SingleOrDefault.

Aber wenn es der Fall ist, dann ist hier, was geändert werden muss:

Option 1

Wenn Sie die Fehlermeldung möchten diese unter der Textbox dann in Ihrem Controller Änderung angezeigt werden:

ModelState.AddModelError("", "Invalid Credentials"); 

An:

ModelState.AddModelError("UserName", "Invalid Credentials"); 

AddModelError braucht 2 Parameter .. die key und die errorMessage für diesen Schlüssel. Die key ist der Name der Eigenschaft in Ihrem Modell.

public void AddModelError(
    string key, 
    string errorMessage 
) 

Option 2

Wenn Sie möchten Meldung unter der Textbox den Fehler nicht angezeigt, sondern an der Spitze der Form:

Dann diese ändern:

@Html.ValidationSummary(true, "", new { @class = "text-danger" }) 

An:

@Html.ValidationSummary(false, "", new { @class = "text-danger" }) 

Für Option 2 müssen Sie die überladenen Methoden sorgfältig lesen. Per MSDN in Korrelation mit, wie Sie Ihre ValidationSummary Setup .. der erste Parameter bool excludePropertyErrors ist .. Sie hatte diesen Satz zu wahr so wurden Sie ohne Objektfehler, weshalb ich das falsch zu ändern vorgeschlagen so Property Fehler wäre enthalten.

public static MvcHtmlString ValidationSummary(
    this HtmlHelper htmlHelper, 
    bool excludePropertyErrors, 
    string message, 
    IDictionary<string, object> htmlAttributes 
) 

Lassen Sie mich wissen, ob dies hilft.

+1

Vielen Dank! es funktionierte. Eine sehr hilfreiche Erklärung. Ja, der Benutzername ist eindeutig und ich habe ihn in SingleOrDefault geändert. Danke nochmal! – ukama

Verwandte Themen