![](/img/trans.png)
[英]Why a ModelState error being added more that once in my ASP.NET MVC site?
[英]ASP.NET MVC: ModelState error message not being displayed
我只是ASP.NET MVC的初学者。 我刚开始创建我的登录页面,它可以正常工作,但是当用户输入错误的凭据时出现问题。 这是我所做的:
用户资料
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; }
}
家庭控制器:
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
语句构造错误,因为到目前为止,如果ModelState Invalid Credentials
,那么您仅想显示Invalid Credentials
错误。
因此,您需要重写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
属性是唯一的 ,因为如果您有2个用户具有完全相同的UserName
和Password
并且您遇到了FirstOrDefault
事件,则可能会让一个用户使用另一个用户的凭据登录。 因此,我将确保UserName
属性是唯一的,并将FirstOrDefault
更改为SingleOrDefault
。
但是,如果确实如此,则需要进行以下更改:
选项1
如果您希望错误消息显示在文本框中,请在您的控制器中进行以下更改:
ModelState.AddModelError("", "Invalid Credentials");
至:
ModelState.AddModelError("UserName", "Invalid Credentials");
AddModelError
接受2个参数.. key
和该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,您需要仔细阅读重载的方法。 每个MSDN与您的ValidationSummary
设置相关。.第一个参数是bool excludePropertyErrors
..您已将其设置为true,因此要排除属性错误,这就是为什么我建议将其更改为false的原因 ,因此将属性错误设为包括在内 。
public static MvcHtmlString ValidationSummary(
this HtmlHelper htmlHelper,
bool excludePropertyErrors,
string message,
IDictionary<string, object> htmlAttributes
)
让我知道是否有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.