【问题标题】:Is ModelState and AddModelError persistant in a Controller/Action?ModelState 和 AddModelError 在 Controller/Action 中是否持续存在?
【发布时间】:2010-11-02 04:46:45
【问题描述】:

我的控制器操作:

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Login()
    {
        return View();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Login(string UserName, string Password, bool RememberMe)
    {
        var userNameValidationResults = _validatorProvider.Validate<IMailAddressValidator>(UserName);
        foreach (var result in userNameValidationResults.Where(r => !r.Passed)) {
            ModelState.AddModelError("UserName", result.ErrorMessage);
        }

        var passwordValidationResults = _validatorProvider.Validate<IStringLengthValidator>(Password);
        foreach (var result in passwordValidationResults.Where(r => !r.Passed)) {
            ModelState.AddModelError("Password", "Please enter a password.");
        }

        if (!ModelState.IsValid)
            return View();

        bool validUser = _userMembershipService.ValidateUser(UserName, Password);

        if (!validUser) {
            ModelState.AddModelError("_FORM", "Invalid e-mail address and/or password.");
            return View();
        }

        _userAuthenicationService.Login(UserName, RememberMe);

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

我的看法:

<h2>Login</h2>
<%= Html.ValidationSummary() %>
<% using (Html.BeginForm()) { %>
    <%= Html.TextBox("UserName") %>
    <%= Html.Password("Password") %>
    <%= Html.CheckBox("RememberMe") %>
    <input type="submit" value="Login" />
<% } %>

如果我在验证错误后再次提交表单,我会在 ValidationSummary 中收到另一个错误(完全相同的错误)。为什么会这样?谢谢。

编辑我的意思是我有n-number of errors 其中n 是提交的数量。

编辑 2 我现在遇到的问题似乎仍然存在 - 即使表单字段值也不会改变。我在上面更新了我的代码。另外,我将 Castle Windsor 用于 IoC 容器,但我认为这不会是我的问题的根源。但对于可能的情况,这里是我用来注册我的控制器的来源。

        container.Register(
            AllTypes
                .FromAssemblyNamed("Aplication")
                .BasedOn<IController>()
                .Where(t => t.Name.EndsWith("Controller"))
                .Configure(c => c.LifeStyle.Is(LifestyleType.Transient))
                .WithService
                .FirstInterface()
            );

【问题讨论】:

  • 你能解释一下这个问题吗?再次“提交表格”是什么意思?也许您需要先在 ModelState 中清除错误。
  • 您确定您的验证器不会再次生成错误吗? ModelState 和错误不会在调用之间持续存在。可以贴一下表单的html代码吗?
  • 不应该,因为我使用break;进行循环控制检查
  • 当您说“再次提交表单”时,是否可以假设您不再提交完全相同的数据?
  • 嗯,是的,也不是。可以一样,也可以不一样。

标签: c# asp.net-mvc modelstate


【解决方案1】:

其实,这是我的温莎城堡配置。

 container.Register(
        AllTypes
            .FromAssemblyNamed("Aplication")
            .BasedOn<IController>()
            .Configure(c => c.LifeStyle.Is(LifestyleType.Transient))
            .WithService
            .FirstInterface()
        );

奇怪的是,我不能同时执行 based on 和 where 子句。

【讨论】:

    【解决方案2】:

    这里唯一保留的是用户名、密码和 rememberMe 值。提交表单时,用户名、密码和 rememberMe 会自动添加到 ModelState 中。然后 Html.TextBox() 从 ModelState 中获取值并将其插入 HTML。

    例如,如果您提交了错误的用户名,控制器会添加一个 ModelState 错误。表单再次呈现,但您会看到 userName 已被旧值填充。如果你再次提交,你显然会再次得到同样的错误。

    【讨论】:

    • 我知道,但它似乎保持一切不变。
    猜你喜欢
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2016-02-05
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多