c# - 在 MVC4 View 中针对 ViewModel 执行客户端验证

标签 c# asp.net-mvc validation asp.net-mvc-4 client-side-validation

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

首先,让我们选择示例。应用程序首次启动时显示的管理员登录创建屏幕(只是不告诉站点所有者“第一次使用 admin/admin 作为登录名”)。

View 模型:

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

部分 View (创建第一个管理员时只需要几个字段)

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

Controller

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

目前

如果我在表单中输入了无效的电子邮件地址、空密码等并点击提交,我正确收到错误通知。好的,我们继续

我想要什么

因为我正在做一个 Metro 风格的设计,所以我希望每次用户取消焦点时都会对该字段进行文本框验证。

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

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

我必须取消隐藏的 ASP.NET MVC 4 验证中是否还有任何 secret ?

最佳答案

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

您可以为您的输入添加一个全局事件,然后在模糊元素上调用它。像这样的东西:

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

关于c# - 在 MVC4 View 中针对 ViewModel 执行客户端验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15692779/

相关文章:

c# - 在xml中一次添加多个节点

c# - 我不太了解 C# 中的转换

c# - LINQ "' s' is not in scope"when creating where clause dynamically

jquery - 如何验证一个日期时间比另一个日期时间客户端更新并在失败时发布警告

c# - 无法读取 Startup.cs 中 JSON 文件的设置

Spring - Jackson 请求映射与验证。当为 long 属性给出字符串时抛出 "HttpMessageNotReadableException"

ruby-on-rails - 使用 HMABTM 验证所有权的最佳方式

c# - 插入带有 for 循环错误的查询

validation - 如何仅在成功提交表单后显示对话框

c# - MVC 存储库架构和访问不同的表