asp.net-mvc - ASP.NET MVC - 如何从不同的 Controller 维护 ModelState?

标签 asp.net-mvc validation redirect login

我有一个带有显示 Index.aspx View 的 Index 操作的 HomeController。它有一个用户名/密码登录部分。当用户单击提交按钮时,它会 POST 到 AccountController 中的登录操作。

        <% Html.BeginForm("Login", "Account", FormMethod.Post); %>

在该操作中,它测试用户名/密码的有效性,如果无效,则将用户发送回登录页面,并显示凭据错误的消息。
    [HttpPost]
    public ActionResult Login(LoginViewModel Model, string ReturnUrl)
    {
        User user = MembershipService.ValidateUser(Model.UserName, Model.Password);
        if (user != null)
        {
            //Detail removed here
            FormsService.SignIn(user.ToString(), Model.RememberMe);
            return Redirect(ReturnUrl);
        }
        else
        {
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
        }
        // If we got this far, something failed, redisplay form
        return RedirectToAction("Index", "Home");  // <-- Here is the problem.  ModelState is lost.
    }

但问题是:ValidationSummary 总是空白,因为当我们 RedirectToAction 时我们丢失了模型。

所以问题是:如何在没有重定向的情况下将用户发送到不同 Controller 上的操作?

最佳答案

正如其他人所说,如果验证失败,通常会返回 View ,但是当您从帐户 Controller 调用时,您将需要指定 View 的完整路径

return View("~/Views/Home/Index.aspx", model);

或者

如果登录失败,通常会有一个单独的登录页面并重定向到该页面。两个页面都将提交相同的登录操作。例如,Facebook 就是这样做的。

或者

因为您只想显示错误消息
return RedirectToAction("Index", "Home", new { LoginAttempts = 1 });

然后在您的索引操作中阅读 LoginAttempts参数并选择相应地显示错误消息。

关于asp.net-mvc - ASP.NET MVC - 如何从不同的 Controller 维护 ModelState?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4522316/

相关文章:

redirect - 在 joomla virutemart 付款过程完成后如何找到响应?

redirect - 为什么 https 总是与 www 子域一起使用?

c# - “索引超出范围。必须为非负数且小于集合的大小。\r\n参数名称 : index

javascript - 验证具有最小和最大范围的输入类型编号

输入类型不是 "submit"时的 HTML5 验证

JavaScript,如果提交为真(使用 colorbox 和 jquery 验证)

ruby-on-rails - 测试失败 : Expected response to be a <redirect>, 但为 <200>

c# - Controller 收不到来自json的数据

javascript - View 未将模型传递给 Controller ​​ - ASP.Net MVC

c# - 将参数值从一个 View 转移到另一个 View ?