ModelState.AddModelError未在视图中显示错误 - ASP.NET

时间:2016-04-05 19:11:22

标签: asp.net

我一直在试图解决这个问题,一直在撞墙。

我有这个视图控制器

public class LoginController : Controller
    {
        public ActionResult Index(LoginClass model)
        {
            return View(model);
        }

        [HttpPost]
        public ActionResult Login(LoginClass model, string ReturnUrl)
        {

            if (!this.ModelState.IsValid)
            {
                return this.View(model);
            }

            if (ModelState.IsValid)
            {
                if (Membership.ValidateUser(model.UserName, model.Password))
                {
                    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                    if (Url.IsLocalUrl(ReturnUrl) && ReturnUrl.Length > 1 && ReturnUrl.StartsWith("/")
                        && !ReturnUrl.StartsWith("//") && !ReturnUrl.StartsWith("/\\"))
                    {
                       return Redirect(ReturnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError(string.Empty, "The user name or password provided is incorrect");
                }


            }

            return RedirectToAction("Index", "Login", model);

        }

        public ActionResult Logout()
        {
            FormsAuthentication.SignOut();

            return RedirectToAction("Index", "Home");
        }

    }

这是我的观点:

<section id="login">
    <div class="container">
        <form action="~/Login/Login" id="Login" method="post">
            <div class="row">
                <div class="col-md-12">
                    <p>
                        <label for="username">Username</label>
                        <input type="text" id="username" name="username" class="form-control" />
                    </p>
                </div>
            </div>
            <div class="row">
                <div class="col-md-12">
                    <p>
                        <label for="password">Password</label>
                        <input type="password" id="password" name="password" class="form-control" />
                    </p>
                </div>
            </div>
            <div class="row">
                <div class="col-md-12">
                    <p>
                        <input type="submit" id="submit" name="submit" value="Login" class="btn btn-default" />
                    </p>
                </div>
            </div>
            <div class="row">
                <div class="col-md-12">
                    <p>
                        <label for="password">Remember Me?</label>
                        <input type="checkbox" id="chkPersist" name="chkPersist" />
                    </p>
                </div>
            </div>
            <div class="row">
                <div class="col-md-12">
                    <p>
                        @Html.ValidationSummary()
                    </p>
                </div>
            </div>
        </form>
    </div>
</section>

我的问题是,当我输入错误的用户名和密码时,我的错误消息没有出现。为什么不显示?

2 个答案:

答案 0 :(得分:1)

您需要使用Html Helper功能添加占位符以显示消息。

 <div>@Html.ValidationMesssage("KeyName")</div>

到您的视图,以便您可以显示验证消息。

KeyName来自控制器

  ModelState.AddModelError("KeyName", "The user name or password provided is incorrect");

此外,您可能需要确保在web.config中启用了客户端验证(通常是)

 <appSettings>
   <add key="ClientValidationEnabled" value="true" />
   <add key="UnobtrusiveJavaScriptEnabled" value="true" />
 </appSettings>

答案 1 :(得分:1)

问题在于Login方法的最后一行。您正在呼叫RedirectToAction而不是View。这会导致您丢失所有特定于视图的状态,包括您在Login操作中构建的模型状态和验证错误。您可以像这样更改Login方法(我简化了一点),实际上唯一的变化就是在最后一行用RedirectToAction("Index", "Login", model)替换View(model)

如果您确实想要在身份验证失败的情况下重定向,并且您确实想要使用RedirectToAction,那么请查看我发布的here的其他答案。

[HttpPost]
public ActionResult Login(LoginClass model, string ReturnUrl)
{
    if (!this.ModelState.IsValid)
        return this.View(model);

    if (Membership.ValidateUser(model.UserName, model.Password))
    {
        FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

        if (Url.IsLocalUrl(ReturnUrl) && ReturnUrl.Length > 1 && ReturnUrl.StartsWith("/")
            && !ReturnUrl.StartsWith("//") && !ReturnUrl.StartsWith("/\\"))
        {
           return Redirect(ReturnUrl);
        }
        else
        {
            return RedirectToAction("Index", "Home");
        }
    }
    ModelState.AddModelError(string.Empty, "The user name or password provided is incorrect");
    return this.View(model); // return to the same view to show your error message

    // return RedirectToAction("Index", "Login", model); // do not redirect
}