Повторно отобразить введенные данные в случае ошибки в форме ASP.NET MVC - PullRequest
1 голос
/ 25 июня 2009

Я работаю над этой проблемой уже 2 дня, и это простая проблема, и я просто не вижу ошибки в коде, даже после сравнения с другими проектами, где это работает.

Не могли бы вы помочь?

Я работаю над разделом учетных записей моего веб-сайта, используя членство в ASP.NET и класс контроллера учетных записей, созданный с помощью ASP.NET MVC.

Однако при регистрации, когда пользователь оставляет пустыми некоторые поля, введенный текст не отображается при повторном отображении страницы.

Вот регистрационное сообщение

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Register(FormCollection formValues)
    {

        ViewData["PasswordLength"] = MembershipService.MinPasswordLength;

        if (ValidateRegistration(formValues))
        {

            // Attempt to register the user
            MembershipCreateStatus createStatus = MembershipService.CreateUser(formValues["username"], formValues["password"], formValues["email"]);

            if (createStatus == MembershipCreateStatus.Success)
            {
                FormsAuth.SignIn(formValues["username"], false /* createPersistentCookie */);

                return RedirectToAction("CreateCustomer", "Account");
            }
            else
            {
                ModelState.AddModelError("_FORM", ErrorCodeToString(createStatus));
            }
        }

        // If we got this far, something failed, redisplay form
        return View();
    }

И функция проверки регистрации

 private bool ValidateRegistration(FormCollection formValues)
    {
        if (String.IsNullOrEmpty(formValues["userName"]))
        {
            ModelState.AddModelError("username", "You must specify a username.");
        }
        if (String.IsNullOrEmpty(formValues["email"]))
        {
            ModelState.AddModelError("email", "You must specify an email address.");

        }
        if (formValues["password"] == null || formValues["password"].Length < MembershipService.MinPasswordLength)
        {
            ModelState.AddModelError("password",
                String.Format(CultureInfo.CurrentCulture,
                     "You must specify a password of {0} or more characters.",
                     MembershipService.MinPasswordLength));

        }
        if (!String.Equals(formValues["password"], formValues["confirmPassword"], StringComparison.Ordinal))
        {
            ModelState.AddModelError("_FORM", "The new password and confirmation password do not match.");
        }
        if (!String.Equals(formValues["email"], formValues["confirmEmail"], StringComparison.Ordinal))
        {
            ModelState.AddModelError("confirmEmail", "The email and confirmation email addresses do not match.");
        }
        return ModelState.IsValid;
    }

И на всякий случай вот представление реестра

"%>

регистр

Создать новую учетную запись

Используйте форму ниже, чтобы создать новую учетную запись.

Длина пароля должна составлять не менее <% = Html.Encode (ViewData ["PasswordLength"])%> символов.


<% = Html.ValidationSummary ()%>
<% using (Html.BeginForm ()) {%> Имя пользователя: <% = Html.TextBox ("username")%>
                <%= Html.ValidationMessage("username") %>
            </td>
            </tr>

            <tr>
            <td>Email:</td>
            <td><%= Html.TextBox("email") %>
                <%= Html.ValidationMessage("email") %>
            </td>
            </tr>
            <tr>
            <td>Confirm Email:</td>
            <td>
                <%= Html.TextBox("confirmEmail") %>
                <%= Html.ValidationMessage("confirmEmail") %>
            </td>
            </tr>
            <tr>
            <td>Password:</td>
            <td>
                <%= Html.Password("password") %>
                <%= Html.ValidationMessage("password") %>
            </td>
            </tr>
            <tr>
            <td>Confirm password:</td>
            <td>
                <%= Html.Password("confirmPassword") %>
                <%= Html.ValidationMessage("confirmPassword") %>
            </td>
            </tr>
            <tr>

            <td></td>
            <td>
                <input type="submit" value="Register" />
            </td>
            </table>
    </div>


<% } %>

Ответы [ 4 ]

5 голосов
/ 25 июня 2009

Сразу же я думаю:

// If we got this far, something failed, redisplay form
return View();

Off ваш первый раздел убивает вас. Вид должен что-то отображать, а вы ничего не даете. Я справился с этим, создав копию переданных значений и отправив ее обратно через вызов метода View:

View(returnedValues);

Где ResetPageCreate - это копия отправленных исходных значений (Если вам нужно каким-то образом изменить информацию перед попыткой сохранения). Таким образом, у представления есть модель для работы и, следовательно, значения для отображения.

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

Вам нужно вызвать Model.SetModelValue (), потому что все, что вы сделали, это сообщите форме, что в ней есть ошибки и какие поля находятся в этих ошибках, НО вы не сказали, что это за ошибочные данные.

Попробуйте что-то вроде этого:

private bool ValidateRegistration(FormCollection formValues)
{
    if (String.IsNullOrEmpty(formValues["userName"]))
    {
        ModelState.AddModelError("userName", "You must specify a username.");
    }

    if (String.IsNullOrEmpty(formValues["email"]))
    {
        ModelState.AddModelError("email", "You must specify an email address.");
    }

    if (formValues["password"] == null || formValues["password"].Length < MembershipService.MinPasswordLength)
    {
        ModelState.AddModelError("password",
            String.Format(CultureInfo.CurrentCulture,
                 "You must specify a password of {0} or more characters.",
                 MembershipService.MinPasswordLength));
    }

    if (!String.Equals(formValues["password"], formValues["confirmPassword"], StringComparison.Ordinal))
    {
        ModelState.AddModelError("confirmPassword", "The new password and confirmation password do not match.");
    }

    if (!String.Equals(formValues["email"], formValues["confirmEmail"], StringComparison.Ordinal))
    {
        ModelState.AddModelError("confirmEmail", "The email and confirmation email addresses do not match.");
    }

    if (!ModelState.IsValid)
    {
        IDictionary<string, ValueProviderResult> valueProvider = formvalues.ToValueProvider();
        ModelState.SetModelValue("userName", valueProvider["userName"]);
        ModelState.SetModelValue("email", valueProvider["email"]);
        ModelState.SetModelValue("confirmEmail", valueProvider["confirmEmail"]);
        ModelState.SetModelValue("password", valueProvider["password"]);
        ModelState.SetModelValue("confirmPassword", valueProvider["confirmPassword"]);
    }

    return ModelState.IsValid;
}

HTHS, Charles

Ps. Вы должны обрезать любой ввод, который вам требуется или собираетесь проверить его длину ... Я попал в аналогичную ловушку раньше: -)

1 голос
/ 25 сентября 2009

Эй! просто быстрое предложение, только что увидел этот пост и подумал сделать небольшое предложение

            IDictionary<string, ValueProviderResult> valueProvider = Form.ToValueProvider();
            foreach (string k in Form.Keys)
            {
                ModelState.SetModelValue(k, valueProvider[k]);
            }
            return View("Index");
0 голосов
/ 25 июня 2009

Помните, что Интернет - это среда без состояния. Поэтому при повторном отображении страницы на наличие ошибок повторно отображенная страница ничего не знает о ранее введенных значениях, если только вы не сделали что-то вроде рекомендованного Programmin Tool.

...