在MVC4视图中对ViewModel执行客户端验证

本文关键字:执行 客户端 验证 ViewModel MVC4 视图 | 更新日期: 2023-09-27 18:06:37

我想知道什么是处理客户端,javascript或jQuery驱动的MVC4字段对放置在ViewModel的字段属性验证的最佳方法。

首先,让我们选择示例。在应用程序第一次启动时显示管理员登录创建屏幕(只是没有对站点所有者说"第一次登录时使用admin/admin")。

ViewModel:

public class AdministratorViewModel : AbstractViewModel
{
    [Required]
    [Display(ResourceType = typeof(ManageAdminsViewModelResources), Name = "lblUsername")]
    public string Username { get; set; }
    [Required]
    [Display(ResourceType = typeof(ManageAdminsViewModelResources), Name = "lblEmailAddress")]
    [EmailAddress]
    public string EmailAddress { get; set; }
    [Required]
    [Display(ResourceType = typeof(ManageAdminsViewModelResources), Name = "lblPassword")]
    [AdminPassword]
    public string Password { get; set; }
    [Required]
    [Display(ResourceType = typeof(ManageAdminsViewModelResources), Name = "lblPasswordConfirm")]
    [Compare("Password")]
    public string PasswordConfirm { get; set; }
    [Display(ResourceType = typeof(ManageAdminsViewModelResources), Name = "lblLastLogin")]
    public DateTime? LastLogin { get; set; }
    [Display(ResourceType = typeof(ManageAdminsViewModelResources), Name = "lblPasswordExpiry")]
    public DateTime? PasswordExpiry { get; set; }
    [Display(ResourceType = typeof(ManageAdminsViewModelResources), Name = "lblBlocked")]
    public bool Blocked { get; set; }
}

部分视图(创建第一个admin时只需要几个字段)

@using (Html.BeginForm())
{
    @Html.ValidationSummary(false)
    @Html.AntiForgeryToken()
    <fieldset>
        <legend>@ManageAdminsViewResources.legendCreateAdmin</legend>
        <div class="desktoptile">
            @Html.LabelFor(m=>m.Username)
            @Html.EditorFor(m => m.Username)
            @Html.ValidationMessageFor(m => m.Username)
        </div>
        <div class="desktoptile">
            @Html.LabelFor(m=>m.Password)
            @Html.PasswordFor(m => m.Password)
            @Html.ValidationMessageFor(m => m.Password)
        </div>
        <div class="desktoptile">
            @Html.LabelFor(m=>m.PasswordConfirm)
            @Html.PasswordFor(m => m.PasswordConfirm)
            @Html.ValidationMessageFor(m => m.PasswordConfirm)
        </div>
        <div class="desktoptile">
            @Html.LabelFor(m=>m.EmailAddress)
            @Html.EditorFor(m => m.EmailAddress)
            @Html.ValidationMessageFor(m => m.EmailAddress)
        </div>
        <input type="submit" value="@ManageAdminsViewResources.btnCreate"/>
    </fieldset>
}
控制器

    [AllowAnonymous]
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult CreateFirst(AdministratorViewModel viewModel)
    {
        if (!ModelState.IsValid) return View(viewModel);
        [...................]
目前

如果我在表单中输入了无效的电子邮件地址,空密码等,并且点击 Submit,那么正确会通知错误。好的,我们继续

我想要的

由于我正在做一个metro风格的设计,我希望每次用户解除焦点时,都会对该字段进行文本框验证。

编写硬编码的jQuery片段并不是最好的选择。我想一个数据驱动的方法,可能嵌入在MVC4,我目前正在学习。

因此,给定一个具有标准自定义属性的ViewModel(无论如何,需要一点Javascript,考虑检查密码复杂性的Org.Zighinetto.AdminPasswordAttribute), 我如何以最不引人注目的方式强制客户端验证,而无需在每个html标记上指定客户端标记并编写尽可能少的代码?

在ASP中还有什么秘密吗?. NET MVC 4验证,我必须取消隐藏?

在MVC4视图中对ViewModel执行客户端验证

那么,您将调用jQuery验证使用jQuery(因为它是用jQuery编写:))

您可以为您的输入添加一个全局事件,然后在blurred元素上调用它。比如:

$("input").blur(function () {
    $(this).valid();
});

从我的(学习)角度来看,正确的答案应该是:

解释:

当jQuery untrutive Validator加载到页面中时,MVC4自动完成公共属性的验证,否则只执行服务器端验证。

大多数(如果不是全部的话)MVC4 ValidationAttribute实现了IClientValidation。这个接口在服务器端代码中封装了jQuery Validator验证函数。很难解释它是如何工作的,但是说这个接口返回客户端函数的名称(由jQuery发行版提供或由用户实现),而基本上是错误的至少给试图理解验证如何工作的新手用户一个想法。

答:

继续使用数据驱动模型/视图模型注释。检查是否在页面中加载了NuGet包jQuery Unobtrusive Validation,然后根据需要实现IClientValidation(我在这里找到了一个关于多个错误的教程),字段被自动验证。