zoukankan      html  css  js  c++  java
  • 爱上MVC3~为下拉列表框添加一个自定义验证规则

    回到目录

    开发它的原因:

    之前的同事,也是我的哥们,问我下拉列表框是否可以支持验证,这个问题看似简单,但确实MVC里有为我们提供,所以,只能自己写个扩展了,即自己写一个attribute特性,让它继承ValidationAttribute,使它可以与其它MVC提供的验证一起使用.

    MVC验证是怎么运行的:

    在MVC的特性验证,很方便,很直接,它无论是在数据安全性上还是在页面表现上都做的不错,它的运行机制是这样的,前台表单验证规则有个名称,然后前台JS有对这个规则编写的代码,用来控制前台HTML标记的显示,而后台主要是生成验证规则和向前台参数赋值的。事实上,我们要知道的是,MVC验证不是简单的后台验证,它还有对前台页面的控制的JS部分,它一般被继承到了jquery.validate.min.js里了,如果我们要是自己开发一套验证规则,也需要自己的JS库与相配合。

    说干就干

    C#部分:

       [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
        public sealed class NotDefaultValueAttribute : ValidationAttribute, IClientValidatable
        {
            public string InputString { get; set; }
            public NotDefaultValueAttribute()
            {
                ErrorMessage = "请选其中一项";
            }
            public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
            {
                ModelClientValidationRule rule = new ModelClientValidationRule
               {
                   ValidationType = "notdefaultvalue",
                   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;
            }
        }

    为viewmodel添加特性

      public class TestModel
        {
            [Required]
            [Display(Name = "用户名")]
            public string UserName { get; set; }
    
            [Required]
            [DataType(DataType.Password)]
            [Display(Name = "密码")]
            public string Password { get; set; }
    
            [Display(Name = "爱好")]
            [NotDefaultValue(InputString = "1")]/*如果用户选择为1,则验证不通过*/
            public IEnumerable<SelectListItem> Liker { get; set; }
        }

    在前面添加相对应的JS代码,建议将自定义的JS库放在一个单独的文件里,这样扩展性更强一些。

        $.validator.addMethod('notdefaultvalue', function (value, element, param) {
            if (value == false) {
                return true;
            }
            if (value.indexOf(param) != -1) {
                return false;
            }
            else {
                return true;
            }
        });
        $.validator.unobtrusive.adapters.addSingleVal('notdefaultvalue', 'inputstring');

    OK,现在就可以运行我们的程序了,看看效果吧

    怎么样,像这种扩展,我们还可以写很多,举一反三吧,呵呵!

    回到目录

  • 相关阅读:
    预览图片功能 直接复制就OK
    记录:express返回自定义http状态吗
    Git tag 给当前分支打标签
    css双飞翼和圣杯布局
    简单模拟MVVM数据双向绑定
    JS的自定义事件(观察者模式)
    js模拟触发事件
    QueryString和BASE64
    WebResource.axd文件的配置和使用
    处理json中的异常字符
  • 原文地址:https://www.cnblogs.com/lori/p/3477100.html
Copyright © 2011-2022 走看看