MVC验证02-自定义验证规则、邮件验证

原文:MVC验证02-自定义验证规则、邮件验证

本文体验MVC自定义验证特性,来实现对邮件的验证。对于刚写完的自定义验证特性,起初只能支持后端验证。如果要让前端jquery支持,还必须对jquery的验证进行扩展。

本文与"MVC验证01-基础、远程验证"相关,如有需要,请参考。 

 

当我们验证有关Email属性的时候,我们可能这样写:

[RegularExpression(@"\w.+\@\w.+")]
public string Email { get; set; }

这仅仅考虑了@符号,但这还不够,我们又可能这样写:

[RegularExpression(@"^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]+$")]
public string Email { get; set; }

这样略显"臃肿",实际上,我们可以扩展MVC的ValidateAttribute特性,做到“一次封装,多次使用”。

  自定义验证特性

展开using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;

namespace MvcValidation.Extension
{
    public sealed class EmailAttribute : ValidationAttribute
    {
        public const string reg = @"^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]+$";

        public EmailAttribute()
        {
        }

        //重写基类方法
        public override bool IsValid(object value)
        {
            if (value == null)
                return true;

            if (value is string)
            {
                Regex regEx = new Regex(reg);
                return regEx.IsMatch(value.ToString());
            }
            return false;
        }
    }
}

 

注意:
把自定义扩展类声明为sealed class。
此处验证邮件的正则表达式不见得是最完美的。

  自定义特性的用武之地:View model

展开using MvcValidation.Extension;
    public class RegisterModel
    {
        [Required]
        [StringLength(6, MinimumLength = 2)] //加
        [Display(Name = "用户名")]
        [Remote("CheckUserName","Validate", ErrorMessage = "远程验证用户名失败")]
        public string UserName { get; set; }

        [Required]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "邮件")]
        [Email]
        public string Email { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "{0}栏位最少{2}个字,最多{1}个字", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "密码")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "确认密码")]
        [System.ComponentModel.DataAnnotations.Compare("Password", ErrorMessage = "密码和确认密码不匹配。")]
        public string ConfirmPassword { get; set; }
    }

  Register.cshtml

展开@model MvcValidation.Models.RegisterModel
@{
    ViewBag.Title = "注册";
}

<hgroup class="title">
    <h1>@ViewBag.Title.</h1>
    <h2>创建新帐户。</h2>
</hgroup>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()

    <fieldset>
        <legend>注册表单</legend>
        <ol>
            <li>
                @Html.LabelFor(m => m.UserName)
                @Html.TextBoxFor(m => m.UserName)
            </li>
            <li>
                @Html.LabelFor(m => m.Email)
                @Html.TextBoxFor(m => m.Email)
            </li>
            <li>
                @Html.LabelFor(m => m.Password)
                @Html.PasswordFor(m => m.Password)
            </li>
            <li>
                @Html.LabelFor(m => m.ConfirmPassword)
                @Html.PasswordFor(m => m.ConfirmPassword)
            </li>
        </ol>
        <input type="submit" value="注册" />
    </fieldset>
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

效果:

注意:
此时的自定义的验证特性只支持后端验证,如果想支持前端jquery验证,需要实现 IClientValidatable接口。

  自定义特性实现IClientValidatable接口,为实现jquery验证做准备

展开using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;
using System.Web.Mvc;

namespace MvcValidation.Extension
{
    public sealed class EmailAttribute : ValidationAttribute, IClientValidatable
    {
        public const string reg = @"^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]+$";

        public EmailAttribute()
        {
        }

        //重写基类方法
        public override bool IsValid(object value)
        {
            if (value == null)
                return true;

            if (value is string)
            {
                Regex regEx = new Regex(reg);
                return regEx.IsMatch(value.ToString());
            }
            return false;
        }

        public System.Collections.Generic.IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            ModelClientValidationRule rule = new ModelClientValidationRule
            {
                ValidationType = "email",
                ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())
            };
            yield return rule;
        }
    }
}

 

注意:
ValidationType属性的值一定要小写,否则报错。

  扩展jquery以支持自定义扩展特性EmailAttribute

jQuery.validator.email.js文件:

//扩展方法
$.validator.addMethod("email", function (value, element) {
    if (value == false) {
        return true;
    }
    this.optional(element) || /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]+$/i.test(value);
});

//扩展方法注册
$.validator.unobtrusive.adapters.addBool("email");

  为了实现jquery客户端验证,Register.cshtml中必须的js文件包括:

1、引用query-{version}.js
2、引用jquery.validate.js
3、引用jquery.validate.unobtrusive.js
4、自定义的jquery验证扩展

 

由于在_Layout.cshtml中有@Scripts.Render("~/bundles/jquery"),所有Register.cshtml中不需要引用了。
Register.cshtml中包含@Scripts.Render("~/bundles/jqueryval"),意味着包含了对2和3的引用。
Register.cshtml中还需要引入jquery针对自定义特性EmailAttribute特性的扩展方法。

完整Register.cshtml中如下:

展开@model MvcValidation.Models.RegisterModel
@{
    ViewBag.Title = "注册";
}

<hgroup class="title">
    <h1>@ViewBag.Title.</h1>
    <h2>创建新帐户。</h2>
</hgroup>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()

    <fieldset>
        <legend>注册表单</legend>
        <ol>
            <li>
                @Html.LabelFor(m => m.UserName)
                @Html.TextBoxFor(m => m.UserName)
            </li>
            <li>
                @Html.LabelFor(m => m.Email)
                @Html.TextBoxFor(m => m.Email)
            </li>
            <li>
                @Html.LabelFor(m => m.Password)
                @Html.PasswordFor(m => m.Password)
            </li>
            <li>
                @Html.LabelFor(m => m.ConfirmPassword)
                @Html.PasswordFor(m => m.ConfirmPassword)
            </li>
        </ol>
        <input type="submit" value="注册" />
    </fieldset>
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
    <script src="~/Scripts/jQuery.validator.email.js"></script>
}

效果:

如何确认已经启用了jquery的验证机制呢?
在没有实现IClientValidatable之前,审查Email的表单元素,如下:

当实现IClientValidatable之后,审查Email的表单元素,如下:

可见,实现IClientValidatable之后,多了data-val-email属性。

注意:
jQuery中本身包含了对Email的验证,这里对jquery的验证作扩展是为了演示。

时间: 2024-11-08 19:00:02

MVC验证02-自定义验证规则、邮件验证的相关文章

使用阿里云邮件推送服务架设自己邮件验证与推送体系

提示:阅读本文需提前了解的相关知识 1.电子邮件协议(http://baike.baidu.com/view/2367542.htm) 2.阿里云邮件推送(https://www.aliyun.com/product/directmail) 3.EDM(电子邮件营销)(http://baike.baidu.com/subview/1212416/8602812.htm) 4.SendCloud邮件服务(http://sendcloud.sohu.com/) 阅读目录结构 引: 一.需求分析 二.

android https验证服务器自定义证书出错

问题描述 android https验证服务器自定义证书出错 在验证服务器证书时,需要用到context,这个context要怎么进行初始化了,或者该怎么给它一个值,谢谢大神解答啊 解决方案 http://blog.csdn.net/yuxiaohui78/article/details/42141425 解决方案二: activity或service都可以是context

MVC验证05-自定义验证规则、验证2个属性值不等

原文:MVC验证05-自定义验证规则.验证2个属性值不等 本文体验2个属性值不等.即当一个属性输入值,另外一个属性输入的值不能和第一个属性值相等.相关文章包括: MVC验证01-基础.远程验证   MVC验证02-自定义验证规则.邮件验证   MVC验证03-自定义验证规则.禁止输入某些值   MVC验证04-自定义验证规则.日期范围验证      自定义验证特性,继承ValidationAttribute并实现IClientValidatable 这次重写了基类的IsValid()方法的另外一

ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)

ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需要将相应的ValidationAttribute应用到Model的类型或者属性上即可.对于自定义验证,我们也只需要定义相应的Validation就可以了,不过服务端验证比较简单,而客户端验证就要稍微复杂一些,本文提供一个简单的实例说明在ASP.NET MVC中实现自定义验证的基本步骤.[源代码从这里下载] 一.AgeRangeAttrib

ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则

对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象,在不同的使用场景中可能具有不同的验证规则.举个简单的例子,对于一个表示应聘者的数据对象来说,针对应聘的岗位不同,肯定对应聘者的年龄.性别.专业技能等方面有不同的要求.但是ASP.NET MVC的Model验证确是Model驱动的,因为验证规则以验证特性的形式应用到Model类型及其属性上.这样的验证方式实际上限制了Model类型在基于不同验证规则的使用场景中的重用.通过上一篇文章<将V

mvc4-各位高手求救:ASP.NET MVC 日期范围 自定义验证特性如何实现呢?

问题描述 各位高手求救:ASP.NET MVC 日期范围 自定义验证特性如何实现呢? 各位高手求救:ASP.NET MVC 日期范围 自定义验证特性如何实现呢?想实现一个日期范围自定义验证特性 ASP.NET MVC 自带的RangeAttribute验证不好使?比如:[Display(Name=""出生日期"")][Required(ErrorMessage=""{0}不能为空!"")][Range(typeof(DateT

asp.net mvc中的自定义js验证问题

问题描述 mvc视图中的TextBoxFor,我在对应的model属性中加主了必须是数字的验证特性.而在view中我需要一个js函数来验证TextBox输入的数据(验证必须输入100的倍数等这些规则),我是在TextBox的onchange事件上调用这个验证js.现在的问题是,调用完onchange事件后,不管验证是否成功,都要继续去验证输入的是否是数字(model中属性设定的验证特性).我现在想做的效果是如果js验证不通过就不执行model中的验证了,直接显示js验证的错误结果.如果js验证通

Asp.net MVC验证哪些事(2)-- 验证规则总结以及使用

原文 Asp.net MVC验证哪些事(2)-- 验证规则总结以及使用 上篇文章Asp.net MVC验证那些事(1)-- 介绍和验证规则使用中,介绍了Asp.net MVC中的验证功能以及如何使用.这里将对MVC中内置的验证规则进行总结. 一,查找所有验证规则 上篇文章中提到,所有的验证规则都是位于下面的命名空间下: using System.ComponentModel.DataAnnotations; 我们可以用ILSpy反编译工具,看看这个命名空间下都有些什么. 下面的图让我们一目了然,

Asp.net 2.0 实现自定义Email格式有效性验证(示例代码下载)

asp.net|示例|下载 (一). 概述及功能          用了两种方法实现验证Email格式,Asp.net验证控件和手动编写代码验证.并用到简单工厂和适配品设计模式, 代码重构技术.    实现自定义Email邮件地址有效性验证, 完成如下功能:Question 11. Email 格式为 user@server.domain. 例如: King.Cheng@hotmail.com or King.Cheng@hotmail.com.cn or King.Cheng@hotmail.