zoukankan      html  css  js  c++  java
  • 浅谈在ASP.NET MVC3中使用IClientValidatable接口实现客户端和服务器端同时验证

    例如:Range、RegularExpression、Required、StringLength等验证属性,这些属性极大的方便了服务器端的验证,同时我们还可以自定义验证属性来满足我们特殊的需求,MVC3的出现进一步提升了验证的便捷性,具体体现在,新增了IValidatableObject和IClientValidatable接口,以及默认支持Range、RegularExpression、Required、StringLength等验证属性在客户端和服务器端进行验证。

    IValidatableObject接口,网上已经有很多的资料了,今天我主要介绍IClientValidatable这个接口,IClientValidatable 接口允许 ASP.NET MVC 在运行时发现支持的客户端验证器,这个接口被用来支持集成不同的验证框架——摘自:ASP.NET MVC3概述。

    下面我们就来看看如何使用IClientValidatable接口来实现客户端和服务器端的验证。

    首先我们来自定义一个验证属性NoIsAttribute.cs,该属性的主要作用是验证用户名中不能含有指定的字符串,代码如下:

    public sealed class NoIsAttribute:ValidationAttribute
        {
            public string InputString { get; set; }
            public NoIsAttribute()
            {
                ErrorMessage = "验证失败";
            }
    
            public override bool IsValid(object value)
            {
                if (value == null)
                    return true;
                string inputString = (string)value;
                if (inputString.Contains(InputString))
                {
                    return false;
                }
                return true;
            }
        }
    


    下面我们来创建一个实体类Logon.cs

    public class Logon
        {
            [DisplayName("年龄")]
            [Range(6,100)]
            public int Age { get; set; }
    
            [DisplayName("姓名")]
            [NoIs(InputString="卜俊生",ErrorMessage="用户名不能含有卜俊生")]
            public string Name { get; set; }
    
        }
    


    在Logon.cs中我们对Name属性应用了Nois验证属性,这样用户在登录过程中如果输入了包含“卜俊生”,那么将无法通过验证,不过该属性只能当用户将数据提交到服务器后才能对数据进行验证,(其中Age属性应用了Range验证属性,因为asp.net mvc3默认支持对range进行客户端验证,所以当用户输入年龄后,如果年龄不符合要求则在客户端进行验证。),为了让NoIs验证属性也能在客户端进行验证,我们就需要将NoIsAttribute.cs实现IClientValidatable接口,所以我们要改造我们的NoIsAttribute.cs代码。

    public sealed class NoIsAttribute:ValidationAttribute,IClientValidatable
        {
            public string InputString { get; set; }
            public NoIsAttribute()
            {
                ErrorMessage = "验证失败";
            }
            public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
            {
                ModelClientValidationRule rule = new ModelClientValidationRule
                {
                    ValidationType = "nois",
                    ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())
                };
                rule.ValidationParameters["inputstring"] = InputString;
                yield return rule;
            }
    
            public override bool IsValid(object value)
            {
                if (value == null)
                    return true;
                string inputString = (string)value;
                if (inputString.Contains(InputString))
                {
                    return false;
                }
                return true;
            }
        }
    

    IClientValidatable 接口很简单,他只有一个GetClientValidationRules()方法,我们只要实现这个方法就可以了,这个方法包括两个参数,metadata表示要验证的属性的元数据,context表示发送请求的Controller的上下文,并且它返回一个ModelClientValidationRule集合。

    我们先来看看这段代码:

    ModelClientValidationRule rule = new ModelClientValidationRule
                {
                    ValidationType = "nois",
                    ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())
                };
    

    这段代码是创建一个ModelClientValidationRule对象,并且为其两个属性赋值,其中ValidationType是验证类型(客户端代码需要调用该属性),ErrorMessage是错误信息。

    让后我们再来看看下面这句代码:

    rule.ValidationParameters["inputstring"] = InputString;
    

    这句代码的意思是添加一个验证属性”inputstring”,它的值是InputString,需要注意的是ValidationParameters是一个IDictionary<string,object>字典,最重要的是ValidationParameters的key必须是小写的,不能包含任何大写字母,否则运行时会报错,请一定要谨记。

    IClientValidatable.cs完成后,我们还需要编写客户端代码才能实现客户端和服务器端同时验证。

    默认情况下asp.net mvc3已经开启了客户端验证和隐藏验证,这一点我们可以在web.config中查看

    <appSettings>
        <add key="ClientValidationEnabled" value="true"/> 
        <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
      </appSettings>
    


    那么默认情况下asp.net mvc3使用jquery的Validate插件进行客户端验证,所以你会在View文件中看见图下代码

    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
    


    下面我们就要为validate插件编写自定义验证规则,并将规则添加到unobtrusive中,代码如下:

    <script type="text/javascript">
        $.validator.addMethod("nois", function (value, element, param) {
            if (value == false) {
                return true;
            }
            if (value.indexOf(param) != -1) {
                return false;
            }
            else {
                return true;
            }
    
        });
        $.validator.unobtrusive.adapters.addSingleVal("nois","inputstring");
    </script>
    



    如要注意的是addMethod这个函数的第一个参数值必须和IClientValidatable.cs中的ValidationType的值必须一致,都必须是”nois”,还有就是 $.validator.unobtrusive.adapters.addSingleVal("nois","inputstring"); 这一句中的第二个参数值要和ValidationParameters的key的值相同,必须是“inputstring“。

    这样就可实现客户端和服务器端同时验证了,有兴趣的朋友可以试下。

  • 相关阅读:
    Flask_脚本
    数据库
    模板
    视图函数和视图类
    HTTP请求
    Flask路由注册
    初识Flask
    微信小程序之基础使用
    celery任务队列
    文件处理小结
  • 原文地址:https://www.cnblogs.com/hyl8218/p/2074380.html
Copyright © 2011-2022 走看看