繁体   English   中英

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

我不确定为什么当用户键入未存储在数据库中的用户名时,为什么没有显示“无效凭据”消息。

在您的问题中,您不会在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个用户具有完全相同的UserNamePassword并且您遇到了FirstOrDefault事件,则可能会让一个用户使用另一个用户的凭据登录。 因此,我将确保UserName属性是唯一的,并将FirstOrDefault更改为SingleOrDefault

但是,如果确实如此,则需要进行以下更改:

选项1

如果您希望错误消息显示在文本框中,请在您的控制器中进行以下更改:

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

至:

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

AddModelError接受2个参数.. key和该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
)

让我知道是否有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM