回到目录

开发它的原因:

之前的同事,也是我的哥们,问我下拉列表框是否可以支持验证,这个问题看似简单,但确实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,则验证不通过*/
public IEnumerable<SelectListItem> Liker { get; set; }
}

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

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

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

aaarticlea/png;base64,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" alt="" />

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

回到目录

爱上MVC3~为下拉列表框添加一个自定义验证规则的更多相关文章

  1. Jquery Validate自定义验证规则,一个汉字等于两个字符长度

    使用Jquery validate时写的一些东西,在这里做个笔记 在使用 Jquery validate 的minlength和maxlength进行文本框内容长度验证的时候,对于一个汉字的长度检测结 ...

  2. Jquery Validate 相关参数及常用的自定义验证规则

    一.官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 二.默认校验规则 1 2 3 4 5 6 7 8 9 10 1 ...

  3. validatebox自定义验证规则以及使用

    //===============jsp======state==== //开启验证 <script  type="text/javascript"> ​​​​​​​y ...

  4. Django【第16篇】:Django之Form组件自定义验证规则

    自定义验证规则以及中间件简单介绍 1.python2和python3中的区别 对于python2内置的字符串类型有str和unicode 比如:"abc"是字符串,u"你 ...

  5. yii2中自定义验证规则rules

    作者:白狼 出处:www.manks.top/article/yii2_custom_rules 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追 ...

  6. yii2中的rules 自定义验证规则详解

    yii2的一个强大之处之一就是他的Form组件,既方便又安全.有些小伙伴感觉用yii一段时间了,好嘛,除了比tp"难懂"好像啥都没有. 领导安排搞一个注册的功能,这家伙刷刷刷的又是 ...

  7. laravel5.5 自定义验证规则——手机验证RULE

    相信很多小伙伴和我一样烦恼,laravel没有自带手机号的验证,每次验证手机号都要写正则这类的规则,每次都是repeat yourself!违背了编码的一个原则,就是Don't repeat your ...

  8. easyui的validatebox重写自定义验证规则的几个实例

    validatebox已经实现的几个规则: 验证规则是根据使用需求和验证类型属性来定义的,这些规则已经实现(easyui API): email:匹配E-Mail的正则表达式规则. url:匹配URL ...

  9. zabbix添加对自定义无规则的关键日志文件的监控

    zabbix添加对自定义无规则日志文件的监控 项目背景及思路: zabbix自带有针对日志文件的监控,自带的监控只能监控到指定文件或者正则匹配的固定日志文件,但当需要监控的文件名没有规律的时候自带监控 ...

随机推荐

  1. Web调试利器OpenWindow

    有些时候调试web页面,在循环里面我们不方便设置断点进行调试,或者调试起来比较麻烦,我们就可以用openWindow的方法打印出想要查看的信息,既方便又省时. 代码如下: OpenWindow = w ...

  2. 通过统计用户DNS解析记录,实现监控用户上网行为

    上次通过扫描抓包分析TTL的方式检测公司网络开放的端口,发现没有开放53端口(DNS),也就是在公司内部的主机只能用服务器自动分配的DNS,并且发现这是台内部服务器.今天发现bing上不去,检测后发现 ...

  3. easyui datagrid中关联combox

    datagrid中列上关联combobox{ field: 'SysCode', title: '系统代码', width: 150, align: 'left', editor: { type: ' ...

  4. <转>C++11标准后的C++阅读书目

    C++11标准后的C++阅读书目 C++ 新标准 C++11 的发布导致了大批新书的出现,还有一些经典书籍也进行了更新.Andrew Binstock 在 Dr.dobbs 上给大家推介一些学习 C+ ...

  5. 算法入门笔记------------Day1

    1.C语言使用%d显示float值,不会把float值转换为近似的int值,而是显示垃圾值,使用%f显示int值,也不会把该int值转换为浮点值 2.三位数反转:输入一个三位数,分离它的百位,十位和个 ...

  6. 搜索引擎 ElasticSearch 之 步步为营 【主目录】

    ElasticSearch 是一款著名的分布式搜索引擎框架,采用Java编写.具有搜索速度快,实时搜索等特色. 以下为官网对ElasticSearch的介绍: Elasticsearch 是一款高可伸 ...

  7. Extjs4.2或以上 使用自定义事件时报错问题

    最近使用了extjs 自定义事件模型,代码如下: function Person(name) { this.name = name; this.addEvents('walk'); } Ext.ext ...

  8. <Android>文件下载

    使用HTTP协议下载文件 创建一个URL对象 通过URL对象,创建一个HttpURLConnection对象 调用getInputStream()方法得到InputStream对象 从InputStr ...

  9. Tomcat settings should be set in Tomcat Preference Page解决

    选择tomcat version,然户找到该tomcat的主目录,输入在tomcat home,下面的参数会自动配置,点击apply. 然后在左边选择advanced,同样把tomcat的主目录复制在 ...

  10. 看到shape文件可以加载到GOOGLE EARTH上的方法,有空可以试试

    引用 Shape文件转为KMZ并在Google Earth中显示 (1)在ArcGIS中加载一个Shape文件,笔者加载的是某个地区的道路(双线道路)图层 (2)在ArcToolbox中,依次展开Co ...