使用jQuery unobtrusive验证asp.net MVC3手动验证文本框

问题描述 投票:1回答:1

所以我有一个允许用户检索忘记密码的多步骤过程。步骤就像这样,对我控制器中的每个步骤执行不同的操作:

  1. 输入用户名和电邮
  2. 输入密码问题答案
  3. 如果一切顺利,请将恢复链接通过电子邮件发送给用户

我试过用一种模型:

public class AccountForgotPassword
{

    [Required()]
    [DisplayName("Username")]
    public string UserName { get; set; }

    [Required()]
    public string Email { get; set; }

    [Required()]
    public string PasswordAnswer { get; set; }

}

但是当我在第一个动作上检查ModelState.IsValid时,由于用户还不能输入他们的密码回答问题,它总是假的并且会产生一些有趣的代码来检查模型状态实际上是否有效但是只是缺失密码答案,因为我不知道用户是谁。

为了解决这个问题,我决定放弃一个打字模型,并在我的动作中使用字符串参数。现在唯一的问题是我不能再使用模型绑定所带来的简单验证线索。

有了这个说,有没有人知道一个简单的方法手动将jQuery验证连接到单个输入,以便它将检查所需的规则?此外,这种布线是否允许我使用验证器生成的默认错误消息,或者我必须在连接它时提供自己的错误消息?在我看来,这会很容易吗?

@{
    ViewBag.Title = "Forgot Password";
}
<h2>
    Forgot Password</h2>
@using (Html.BeginForm())
{ 
    <p>
        @Html.Label("UserName", "Username")
        @Html.TextBox("UserName")
        @Html.ValidationMessage("UserName")
    </p>

    <p>
        @Html.Label("Email", "Email")
        @Html.TextBox("Email")
        @Html.ValidationMessage("Email")
    </p>

    <p>
        <input type="submit" value="Send Form" />
    </p>
}

<script type="text/javascript">
    $.validator.unobtrusive.addRule(..something here...);
</script>

如果有更好的方法,请告诉我。

UPDATE

对于其他发现这一点的人,我确实想出了如何手动添加规则。应该先阅读验证文档。假设上面的视图html,脚本将是:

<script type="text/javascript">
    $(function () {
        $('#UserName').rules('add', {
            required: true,
            messages: {
                required: 'The username field is required.'
            }
        });

        $('#Email').rules('add', {
            required: true,
            messages: {
                required: 'The email field is required.'
            }
        });

        $.validator.unobtrusive.parse('form');
    });
</script>

然而,在考虑了更多并考虑到AFinkelstein的答案之后,我想我会继续制作2个不同的视图模型,并让框架为我工作。

asp.net-mvc-3 jquery-validate unobtrusive-validation
1个回答
2
投票

如果您首先验证用户名和密码,然后再验证密码答案,我认为最简单的解决方案是拥有两个单独的View Models。然后,您仍然可以为每个部分使用适当的视图模型和验证。

© www.soinside.com 2019 - 2024. All rights reserved.