ModelState和AddModelError在Controller / Action中是否持久存在?

时间:2009-06-11 16:21:26

标签: c# asp.net-mvc modelstate

我的控制器操作:

    [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 - 错误数量,其中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()
            );

2 个答案:

答案 0 :(得分:2)

实际上,这是我的Castle Windsor配置。

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

我很奇怪我不能同时根据和where子句做。

答案 1 :(得分:0)

这里唯一存在的是userName,password和rememberMe值。提交表单时,userName,password和rememberMe会自动添加到ModelState中。然后,Html.TextBox()从ModelState中获取值并将其插入HTML中。

例如,如果您提交了错误的userName,则控制器会添加ModelState错误。表单再次呈现,但您将看到userName已填充旧值。如果再次提交,您显然会再次收到同样的错误。