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

时间:2009-06-24 22:57:34

标签: 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();
    }

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;
    }

以下是注册视图

“%&gt;

    寄存器

   

创建新帐户

    

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

    

        密码必须至少为&lt;%= Html.Encode(ViewData [“PasswordLength”])%&gt;字符的长度。     

    
    &lt;%= Html.ValidationSummary()%&gt;
    &lt;%using(Html.BeginForm()){%&gt;                                                        用户名:                  &lt;%= Html.TextBox(“username”)%&gt;

                <%= 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 个答案:

答案 0 :(得分:5)

我正在猜测:

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

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

View(returnedValues);

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

答案 1 :(得分:2)

你需要调用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, 查尔斯

聚苯乙烯。你应该修剪你需要的任何输入或者要验证它的长度......我之前陷入了类似的陷阱: - )

答案 2 :(得分:1)

喂!只是一个快速的建议,只看到这篇文章并想到做一个小建议

            IDictionary<string, ValueProviderResult> valueProvider = Form.ToValueProvider();
            foreach (string k in Form.Keys)
            {
                ModelState.SetModelValue(k, valueProvider[k]);
            }
            return View("Index");

答案 3 :(得分:0)

请记住,网络是无状态环境。因此,当您重新显示页面中的错误时,重新呈现的页面不知道以前输入的值,除非您要执行类似Programmin Tool的建议。