ASP.NET MVC5中的Model验证
Model验证是ASP.NET MVC中的重要部分,它主要用于判断输入的数据类型及值是否符合我们设定的规则,这篇文章就介绍下ASP.NET MVC中Model验证的几种方式。
后台验证
DataAnnotation
DataAnnotation翻译过来是“数据注解”的意思,DataAnnotation命名空间中包含一些用于验证Model的特性,如:RequiredAttribute,CompareAttribute,DisplayAttribute等,我们在创建Model时,将相应的特性性标注到字段上即可实现数据验证。
创建Model:
public class Person
{
[Display(Name = "姓名")]
[Required(ErrorMessage = "姓名是必须的!")]
public string Name { set; get; }
[Display(Name = "姓名")]
public int Age { set; get; }
}
View中的代码:
@model EBuy.Website.Models.Person
@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
<h3 style="color:red;">
@Html.ValidationSummary()
</h3>
</div>
<div>
@using (Html.BeginForm("evaluate", "home", "Post"))
{
@Html.LabelFor(Model => Model.Name)
@Html.TextBoxFor(Model => Model.Name)
@Html.LabelFor(Model => Model.Age)
@Html.TextBoxFor(Model => Model.Age)
<input type="submit" value="提交" />
}
</div>
</body>
</html>
Controller中的代码:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
} public ActionResult Evaluate(Person person)
{
if (ModelState.IsValid)
{
return Content("evaluate success!");
}
return View("Index", person);
}
}
运行程序:
注意,Age属性上并未标注RequiredAttribute,却依然提示Age字段必须,这是因为Age是int类型,int类型不能为null,对于不能为null的类型,ASP.NET MVC默认为是必须的。除此之外,ASP.NET MVC还会帮助我们进行数据类型的验证,如,若在年龄一栏输入非整数,那么验证将不会通过,且会提示数值不合法。
ValuationAttribute
除了使用DataAnnotation中预定义的一些特性进行数据验证外,我们还可以自定义一些验证特性。这里我们通过覆写DataAnnotation命名空间中ValudationAttribute类的IsValid方法来实现自定义验证。示例代码如下:
public class CheckAgeAttribute : ValidationAttribute
{
private int _minage;
public CheckAgeAttribute(int minAge)
{
_minage = minAge;
}
public override bool IsValid(object value)
{
if (value is int)
{
var age = value as int?;
if (age == null)
{
return false;
}
if (age < _minage)
{
return false;
}
return true;
}
return false;
} public override string FormatErrorMessage(string name)
{
return base.FormatErrorMessage(name);
}
}
标注特性:
public class Person
{
[Display(Name = "姓名")]
[Required(ErrorMessage = "姓名是必须的!")]
[MaxLength(, ErrorMessage = "太长了")]
public string Name { set; get; }
[Display(Name = "年龄")]
[CheckAge(, ErrorMessage = "年纪太小!")]
public int Age { set; get; }
}
然后运行程序:
IValidatableObject
通过实现IValidatableObject接口进行数据的验证,示例代码如下:
public class Person : IValidatableObject
{
[Display(Name = "姓名")]
public string Name { set; get; }
[Display(Name = "年龄")]
public int Age { set; get; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
Person person = validationContext.ObjectInstance as Person;
if (person == null)
{
yield break;
}
if (string.IsNullOrEmpty(person.Name))
{
yield return new ValidationResult("您贵姓?");
}
if (person.Age < )
{
yield return new ValidationResult("太年轻了!");
}
}
}
运行程序:
IDataErrorInfo
实现IDataErrorInfo接口也可以进行数据的验证,示例代码如下:
public class Person : IDataErrorInfo
{
[Display(Name = "姓名")]
public string Name { set; get; }
[Display(Name = "年龄")]
public int Age { set; get; } public string this[string columnName]
{
get
{
switch (columnName)
{
case "Name":
if (string.IsNullOrEmpty(Name))
{
return "雁过留声,人过留名";
}
return null;
case "Age":
if (Age < )
{
return "年纪尚轻!";
}
break;
}
return null;
}
} public string Error
{
get
{
//若返回值不是""或null,则不管数据是否合法,则验证都不会通过
//并且会在数据验证成功后显示此处指定的错误信息
return "";
//return "出错啦!";
}
}
}
运行程序:
前端验证
上述验证均是在服务器端进行的,除此之外我们也可以使用js在客户端进行数据的验证。除了我们自己手写js代码外,ASP.NET MVC也提供了前端验证方法,要启用ASP.NET MVC提供的前端验证方法需要在页面中引入三个js文件:
- jquery-1.10.2.min.js(也可以是其它版本的jQuery)
- jquery.validate.min.js
- jquery.validate.unobtrusive.min.js
然后在配置文件中开启客户端验证(默认是开启的):
<configuration>
<appSettings>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
</configuration>
注意:若要使ASP.NET MVC提供的前端验证生效,需要对Model进行数据注解(DataAnnotation)。
引用文件之后,运行程序,然后查看页面源代码,可以看到form中的input标签中多出了 data-val 属性以及其它的和数据注解相关的属性。
对于验证失败的信息,我们需要对用户进行相应的提醒。只需要在<form></form>中添加 @Html.ValidationSummary() 即可。
ASP.NET MVC5中的Model验证的更多相关文章
- ASP.NET MVC4中的Model验证 移除指定验证信息
MVC中通过Model在页面间传值使的程序开发变得更加的快捷,但是很多时候,我们在数据传递的时候为了确保数据的有效性,要对Model的相关属性做基本的数据验证. 不多说直接上个代码,Model的实体类 ...
- ASP.NET MVC中对Model进行分步验证的解决方法
原文:ASP.NET MVC中对Model进行分步验证的解决方法 在我之前的文章:ASP.NET MVC2.0结合WF4.0实现用户多步注册流程中将一个用户的注册分成了四步,而这四个步骤都是在完善一个 ...
- ASP.NET MVC5中的数据注解
ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证(在服务器端和客户端验证数据的有效性) 数 ...
- ASP.NET MVC5中的数据注解(转载)
ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证(在服务器端和客户端验证数据的有效性) 数 ...
- asp.net mvc5中使用缓存依赖SqlCacheDependency
缓存是用来提高应用性能,降低服务器压力.适用于数据不易变,数据易通用的情景, 对于动态查询数据,例如数据分析,最好放弃使用缓存.使用缓存最麻烦的就是保持源数据和缓存的中的数据一致. 缓存(Cache) ...
- ASP.NET MVC中使用窗体验证出现上下文的模型在数据库创建后发生更改,导致调试失败(一)
在ASP.NET MVC中使用窗体验证.(首先要明白,验证逻辑是应该加在Model.View和Controller哪一个里面?由于Model的责任就是负责信息访问与商业逻辑验证的,所以我们把验证逻辑加 ...
- ASP.NET MVC中默认Model Binder绑定Action参数为List、Dictionary等集合的实例
在实际的ASP.NET mvc项目开发中,有时会遇到一个参数是一个List.Dictionary等集合类型的情况,默认的情况ASP.NET MVC框架是怎么为我们绑定ASP.NET MVC的Actio ...
- asp.net mvc5中的过滤器重写
asp.net mvc5中增加了一种过滤器类型叫过滤器重写,这种过滤器类型可以在操作或者控制器上忽略更高层次上设置的过滤器类型,它可以重写五种基本的过滤器接口类型:IAuthenticationFil ...
- asp.net MVC中的@model与Model
asp.net MVC中的@model与Model https://blog.csdn.net/ydm19891101/article/details/44301201 在MVC的实际使用中,我们经常 ...
随机推荐
- Hawk 5. 数据库系统
Hawk在设计之初,就是以弱schema风格定义的.没有严格的列名和列属性.用C#这样的静态强类型语言编写Hawk,其实并不方便.但弱schema让Hawk变得更灵活更强大. 因此,Hawk虽然之前支 ...
- 接口--interface
“interface”(接口)关键字使抽象的概念更深入了一层.我们可将其想象为一个“纯”抽象类.它允许创建者规定一个类的基本形式:方法名.自变量列表以及返回类型,但不规定方法主体.接口也包含了基本数据 ...
- Javascript高性能编程-提高Dom访问速度
在浏览器中对于Dom的操作和普通的脚本的操作处于两个不同的dll中,两个dll的交互是比较耗时的,优化对Dom的操作可以提高脚本的执行速度.下面是对如何优化的一些总结: 将需要多次操作的节点存储在一个 ...
- 解决:win10_x64 VMware Workstation and Hyper-V are not compatible. Remove the Hyper-V role from the system before running VMware Workstation
bcdedit /set hypervisorlaunchtype off A reboot of of the Windows OS is necessary 必须重启才能生效 To enab ...
- WINDOWS系统下MYSQL安装过程中的注意事项
1.首先MySQL的安装方式有两种:一种是MSI安装方式,很简单就像安装Windows软件一样.另外一种就是ZIP安装方式.这种相对而言比较麻烦.新手推荐MSI安装方式. 安装方式有以下两种: MSI ...
- SQL 约束
先用设计器创建约束.再用代码创建约束.数据库约束是为了保证数据的完整性(正确性)而实现的一套机制见文件Employee.sql非空约束(选择复选框)主键约束(PK) primary key const ...
- mysql 大表拆分成csv导出
最近公司有一个几千万行的大表需要按照城市的id字段拆分成不同的csv文件. 写了一个自动化的shell脚本 在/home/hdh 下面 linux-xud0:/home/hdh # lltotal 1 ...
- Ubuntu手动设置DSL连接
在安装完Ubuntu之后,发现图形界面的DSL连接不管用了,郁闷了好几天,想想移动每个月120个小时的流量岂不是白白浪费了.正当我想重返Windows系统的时候,却发现了手动设置连接DSL的好方法,感 ...
- 【微信SEO】公众号也能做排名?
[写于2016年8月] 最近,微信团队发出一则公告,开放公众号运营者一年内更改公众号名一次,这对不少名字起的奇葩名字(包括dkplus)的公众号来说是一件好事. 为什么说是好事呢?公众号名字直接关联到 ...
- CanvasWebgl项目介绍
CanvasWebgl 介绍 CanvasWebgl 是一个基于webgl 开发的2d绘图框架,使用TypeScript开发 CanvasWebgl的功能,是在屏幕空间 或者 3D空间产生一个画布 ...