ASP.NET MVC:未显示 ModelState 错误消息

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

我不确定为什么在用户键入未存储在数据库中的用户名时没有显示消息 "Invalid Credentials"。

在你的问题中,你没有在你的 if 语句中说明 ModelState.AddModelError("", "Invalid Credentials"); 行是否被命中,我怀疑它是。

您的 if 语句构造错误,因为截至目前您只想在 ModelState 无效时显示 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 个用户完全相同的 UserNamePassword 并且出现 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,您需要仔细阅读重载方法。根据 MSDN 与您的 ValidationSummary 设置的相关性.. 第一个参数是 bool excludePropertyErrors.. 您将其设置为 true 所以你排除 属性 错误,这就是为什么我建议将其更改为 false,因此 属性 错误将是 包括.

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

如果有帮助请告诉我。