ASP.NET MVC:不显示ModelState错误消息
我只是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")
}
我不确定当用户键入未存储在数据库中的用户名时,为什么没有显示消息“无效凭证”。
在你的问题中,你没有说明你的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个参数.. key
和errorMessage
为该密钥。 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
)
让我知道这是否有帮助。
非常感谢!有效。一个非常有用的解释。是的,用户名是唯一的,所以我将它改为SingleOrDefault。再次感谢你! – ukama
它不显示,因为如果证书无效,程序的流程不会设置模型状态错误。只有当'ModelState.IsValid'为false时才设置错误。如果这是真的,那么您正在对用户进行身份验证,但是如果无效则不会返回错误。 –
在任何情况下,您都不会将密码作为纯文本存储在数据库中 - 您的散列(和盐)。我强烈建议你的工作尽管[安全,认证和授权](https://www.asp.net/mvc/overview/security) –