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>

另外,如果有更好的方法可以做到这一点,请告诉我。

更新

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

4

1 回答 1

2

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

于 2012-04-27T15:32:14.173 回答