2017-08-31 180 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