如果表单ASP.NET MVC出错,则重新显示输入详细信息

ddd*_*ddd 1 asp.net-mvc asp.net-membership

我已经解决了这个问题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();
    }
Run Code Online (Sandbox Code Playgroud)

和ValidateRegistration功能

 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;
    }
Run Code Online (Sandbox Code Playgroud)

以防这里是Register视图

"%>

寄存器

创建一个新账户

使用下面的表单创建一个新帐户.

密码必须至少为<%= Html.Encode(ViewData ["PasswordLength"])%>个字符.


<%= Html.ValidationSummary()%>
<%using(Html.BeginForm()){%>用户名:<%= Html.TextBox("用户名")%>

                <%= 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>


<% } %>
Run Code Online (Sandbox Code Playgroud)

Pro*_*ool 5

马上我猜测:

// If we got this far, something failed, redisplay form
return View();
Run Code Online (Sandbox Code Playgroud)

关闭你的第一部分是杀了你.视图需要显示一些东西,而你却什么都不给它.我通过创建传入值的副本并通过View方法调用将其推回来处理此问题:

View(returnedValues);
Run Code Online (Sandbox Code Playgroud)

其中ResetPageCreate是发送的原始值的副本(如果您必须更改某些信息,请在保存尝试之前更改信息).这样,View就可以使用模型,因此可以显示值.