2017-08-31 158 views
-1

我只是ASP.NET MVC的初學者。我剛剛開始創建我的登錄頁面,但它工作正常,但當用戶輸入錯誤憑證時,我遇到了問題。這是我做了什麼:ASP.NET MVC:不顯示ModelState錯誤消息

用戶配置

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

而且查看

@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") 
} 

我不確定當用戶鍵入未存儲在數據庫中的用戶名時,爲什麼沒有顯示消息「無效憑證」。

+0

它不顯示,因爲如果證書無效,程序的流程不會設置模型狀態錯誤。只有當'ModelState.IsValid'爲false時才設置錯誤。如果這是真的,那麼您正在對用戶進行身份驗證,但是如果無效則不會返回錯誤。 –

+0

在任何情況下,您都不會將密碼作爲純文本存儲在數據庫中 - 您的散列(和鹽)。我強烈建議你的工作儘管[安全,認證和授權](https://www.asp.net/mvc/overview/security) –

回答

1

在你的問題中,你沒有說明你的if聲明中是否正在命中行ModelState.AddModelError("", "Invalid Credentials");,我懷疑它是。

您的if語句構造錯誤,因爲截至目前您只想顯示Invalid Credentials錯誤,如果ModelState無效..不是用戶的憑據是否存在。

所以,你需要重寫if語句來這是你的:

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

不挑剔,但我希望你UserName屬性是獨特,因爲如果你有完全相同的UserName 2個用戶和Password,你會得到FirstOrDefault,那麼你可能會讓用戶使用他人的憑證登錄。所以我會確保UserName屬性是唯一的,並將FirstOrDefault更改爲SingleOrDefault

但如果這樣做,那麼這裏就是需要改變什麼:

選項1

如果你想在文本框下則顯示在你的控制人變更的錯誤消息是:

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

要:

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

AddModelError需要2個參數.. keyerrorMessage爲該密鑰。 key是您模型中的屬性名稱。

public void AddModelError(
    string key, 
    string errorMessage 
) 

選項2

如果你不想顯示文本框下的錯誤消息,而是在窗體的頂部:

然後改變這:

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

收件人:

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

對於選項2,您需要仔細閱讀重載的方法。每與你怎麼有你ValidationSummary設置相關MSDN ..第一個參數是bool excludePropertyErrors ..你有這樣的設置爲真正所以你排除屬性的錯誤,這就是爲什麼我提出要改變,要,所以財產錯誤將是包括

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

讓我知道這是否有幫助。

+1

非常感謝!有效。一個非常有用的解釋。是的,用戶名是唯一的,所以我將它改爲SingleOrDefault。再次感謝你! – ukama