Являются ли ModelState и AddModelError постоянными в контроллере / действии? - PullRequest
0 голосов
/ 11 июня 2009

Действия моего контроллера:

    [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 ]

2 голосов
/ 15 июня 2009

На самом деле, это была моя конфигурация Castle Windsor.

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

Странно, но я не могу сделать это одновременно на основе и в предложении where.

0 голосов
/ 11 июня 2009

Здесь сохраняются только значения userName, password и запомнитьMe. Когда форма отправлена, userName, пароль и RememberMe автоматически добавляются в ModelState. Затем Html.TextBox () получает значение из ModelState и вставляет его в HTML.

Если вы, например, передаете неверное имя пользователя, контроллер добавляет ошибку ModelState. Форма снова отображается, но вы увидите, что имя пользователя уже заполнено старым значением. Если вы отправите заявку снова, вы, очевидно, снова получите ту же ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...