在.Net MVC中自定义ValidationAttribute标签对Model中的属性做验证
写一个继承与ValidationAttribute类的自定义的验证方法
MVC中传递数据时,大多数都会用Model承载数据,并且在传到控制器后,对Model进行一系列的验证。
我平时经常使用的判断方法比Low,因为Model都是不同的,也需要返回很多不同的信息,所以我都是把很多条件语句封装成私有方法,放在控制器的最下边,然后使用的时候直接调用。
下图就是我平时使用的代码格式,我把验证方法都写在了这里,很低级请轻喷。
其实在.Net MVC中,已经提供了很好的验证方法,就是在属性上面加ValidationAttribute标签的方法,如下图:
如果想要自定义验证的话就需要自己重写一下,下面是我写的简单的自定义的验证方法
方法功能是对字符串形式的属性做长度的验证。方法如下
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.ComponentModel.DataAnnotations;
- namespace WebTest.Common.Utility
- {
- public class ValidateStrLengthAttribute : ValidationAttribute
- {
- public ValidateStrLengthAttribute(int minLength, int maxLength)
- {
- _minLength = minLength;
- _maxLength = maxLength;
- }
- /// <summary>
- /// 最小值
- /// </summary>
- private int _minLength = ;
- /// <summary>
- /// 最大值
- /// </summary>
- private int _maxLength = ;
- /// <summary>
- /// 重写验证规则
- /// </summary>
- /// <param name="value">model中此属性的值(这里是登录密码的值)</param>
- /// <param name="validationContext"></param>
- /// <returns></returns>
- protected override ValidationResult IsValid(object value, ValidationContext validationContext)
- {
- string name = validationContext.DisplayName;//属性名称
- string errorMessage = "";//错误信息
- if (value == null)
- {
- errorMessage = " " + name + "不能为空";
- }
- else
- {
- string val = value.ToString();
- if (string.IsNullOrEmpty(val))
- {
- errorMessage = " " + name + "不能为空";
- }
- else
- {
- if (val.Length >= _minLength && val.Length <= _maxLength)
- {
- return ValidationResult.Success;
- }
- else
- {
- errorMessage = " " + name + " 长度需在" + _minLength + "到" + _maxLength + "之间";
- }
- }
- }
- return new ValidationResult(errorMessage);
- }
- }
- }
下面我写一个小例子验证我的方法是否可用
以登录为例。
Model代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.ComponentModel.DataAnnotations;
- namespace WebTest.Models
- {
- public class LoginModel
- {
- /// <summary>
- /// 用户名
- /// </summary>
- [Display(Name = "用户名")]
- public string UserName { get; set; }
- /// <summary>
- /// 密码
- /// </summary>
- [Display(Name = "密码")]
- public string Pwd { get; set; }
- }
- }
控制器代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- using WebTest.Models;
- namespace WebTest.Controllers
- {
- public class LoginController : Controller
- {
- public ActionResult Index()
- {
- return View();
- }
- /// <summary>
- /// 登录表单提交
- /// </summary>
- /// <param name="model"></param>
- /// <returns></returns>
- [HttpPost]
- public ActionResult Index(LoginModel model)
- {
- return View();
- }
- }
- }
视图页代码:
- @model WebTest.Models.LoginModel
- @{
- Layout = null;
- }
- <!DOCTYPE html>
- <html>
- <head>
- <meta name="viewport" content="width=device-width" />
- <title>Index</title>
- </head>
- <body>
- <div>
- @using (@Html.BeginForm())
- {
- @Html.LabelFor(model => model.UserName)
- @Html.TextBoxFor(model => model.UserName)
- @Html.ValidationMessageFor(model => model.UserName)
- <br />
- @Html.LabelFor(model => model.Pwd)
- @Html.TextBoxFor(model => model.Pwd)
- @Html.ValidationMessageFor(model => model.Pwd)
- <div>
- <input type="submit" value="提交" />
- </div>
- }
- </div>
- </body>
- </html>
最后出来的页面是这样子的(普通的form表单)
现在我可以把我的标签放到属性的上边(方法名是ValidateStrLengthAttribute 标签名称是ValidateStrLength)需要引用下自定义验证方法的命名空间
如下图:
代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.ComponentModel.DataAnnotations;
- using WebTest.Common.Utility;
- namespace WebTest.Models
- {
- public class LoginModel
- {
- /// <summary>
- /// 用户名
- /// </summary>
- [Display(Name = "用户名")]
- [ValidateStrLength(, )]
- public string UserName { get; set; }
- /// <summary>
- /// 密码
- /// </summary>
- [Display(Name = "密码")]
- [ValidateStrLength(, )]
- public string Pwd { get; set; }
- }
- }
现在都写完了,点击提交试一下
例子完毕,如有问题,请多指正^_^。
在.Net MVC中自定义ValidationAttribute标签对Model中的属性做验证的更多相关文章
- 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证
在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现RequiredIf标签对Model中的属性进行验证 具体场景为:某一属性是否允许为null的验证,要根据另 ...
- 在Asp.Net MVC中实现CompareValues标签对Model中的属性进行验证
在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现Model两个中两个属性值的比较验证 具体应用场景为:要对两个属性值的大小进行验证 代码如下所示: /// ...
- CompareValues标签对Model中的属性进行验证
在Asp.Net MVC中实现CompareValues标签对Model中的属性进行验证 在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现Model两个 ...
- 6.2 dubbo在spring中自定义xml标签源码解析
在6.1 如何在spring中自定义xml标签中我们看到了在spring中自定义xml标签的方式.dubbo也是这样来实现的. 一 META_INF/dubbo.xsd 比较长,只列出<dubb ...
- 6.1 如何在spring中自定义xml标签
dubbo自定义了很多xml标签,例如<dubbo:application>,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个简单的例子. 一 编写模型类 package ...
- mvc中动态给一个Model类的属性设置验证
原文:mvc中动态给一个Model类的属性设置验证 在mvc中有自带的验证机制,比如如果某个字段的类型是数字或者日期,那么用户在输入汉字或者英文字符时,那么编译器会自动验证并提示用户格式不正确,不过这 ...
- Android中自定义ListView无法响应OnItemClickListener中的onItemClick方法问题解决方案
如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView 的Item能被选中的基础是它能获取Focus,也就是说 ...
- oracle中自定义type、以及java中传递list到过程中的例子
在java开发过程中有时候为了处理数据的速度更快,会把要处理的数据组装成list,把list作为过程的一个参数,在过程中批量处理,下面就以一个例子做简单的阐述,以此谨记. --药品目录智能审核 --说 ...
- spring mvc 中自定义404页面在IE中无法显示favicon.ico问题的解决方法。
此处用的是jsp,控制层用的是ModelAndView, 具体解决方法如下: @RequestMapping(value = "notfound", method = Reques ...
随机推荐
- Redis系统学习 三、使用数据结构
前言:上一章,简单介绍了5种数据结构,并给出了一些用例.现在是时候来看看一些高级的,但依然很常见的主题和设计模式 一.大O表示法(Big O Notation ) 常用时间复杂度O(1)被认为是最快速 ...
- JavaScript 实现文本编辑器
JavaScript 实现文本编辑器 最近,我需要做一个非常基本的网页内容编辑功能.我不想使用 iframe ,我也不想要一个功能特别多的复杂编辑器,只需要很基本的内容编辑功能,例如粗体,斜体,列表, ...
- 简单2步实现 asp.net mvc ckeditor 图片上传
1.打开ckeditor 包下的 config.js,添加一句 配置(PS:ckeditor 很多功能都在该配置文件里配置),如下: config.filebrowserImageUploadUrl ...
- MacOSX 中如何动态隐藏Dock Icon
XCode创建了一个GUI工程,程序分几种运行模式,一种是agent模式,还有一种是GUI界面.Agent模式是没有界面的GUI程序,通过LaunchAgents启动.创建出来的Info.plist默 ...
- jquery 表单 清空
做了个复杂查询的页面,字段太多了,填了一次,想清空挺麻烦的 $('#myform')[0].reset(); 虽然reset方法可以做到一部分,但是如果你有个元素是这样的 <input name ...
- hdu 1068
找出没有缘分的同学,如果有缘分的建边, 就是求最大独立集问题了 #include<stdio.h> #include<string.h> int n,m,ma[1050][10 ...
- Sql Server (错误:7302)
windows server 2008 x64 sql server 2008 r2 OraClient 11g 错误提示: 解决办法:
- 设计模式(二)-- 外观模式(Facade)
设计模式(二) 外观模式(Facade) 为了解决子系统外部的客户端在使用子系统的时候,既能简单地使用这些子系统内部的模块功能,而又不用客户端去与子系统内部的多个模块交互的问题. 为子系统中的一组接口 ...
- crudandroidandroid——CRUD(在上一篇博客的基础上)
废话就不多说了,开始... 1.Person package com.njupt.sqlite; public class Person { private Integer id; private S ...
- spi数据KL25用SPI操作nor flash
最近研究spi数据,稍微总结一下,以后继续补充: KL25的SPI连接一个nor flash.该flash型号为FM25F04,支撑SPI的模式0和模式3,要求高位先发送,在上升沿采集数据. 通常,S ...