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

时间:2012-04-27 15:28:42

标签: asp.net-mvc-3 jquery-validate unobtrusive-validation

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

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

    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>
    

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

    更新

    对于其他发现此问题的人,我确实想出了如何手动添加规则。应该先阅读验证文档。假设上面的视图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个不同的视图模型,并让框架为我工作。

1 个答案:

答案 0 :(得分:2)

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