MVC中数据验证
http://www.studyofnet.com/news/339.html
http://www.cnblogs.com/kissdodog/archive/2013/05/04/3060278.html
本文导读:ASP.NET MVC3中的Model是自验证的,这是通过.NET4的System.ComponentModel.DataAnnotations命名空间完成的。 我们要做的只是给Model类的各属性加上对应的验证标记(Attributes)就可以让MVC3框架帮我们完成验证。下面介绍MVC中数据验证的相关知识
一、客户端验证
客户端验证主要是为了提高用户体验,在网页不回刷的情况下完成验证。
1、第一步是要在web.config里启用客户端验证,这在MVC3自带的模板项目中已经有了:
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
2、然后在被验证的View页面上要加入这样两个JavaScript,注意,他们是依赖于JQuery的:
<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>
3、验证消息的显示有两种,一种是ValidationSummary,它可以显示一份验证消息的汇总,包括从后台Action里返回的消息。
另一种是Model中各属性对应HTML控件的验证消息:
(1)、Required
必填选项,当提交的表单缺少该值就引发验证错误。
(2)、StringLength
指定允许的长度
指定最大长度:
[StringLength(20)] //最大长度不超过20个字符
指定最短于最长限制:
[StringLength(20,MinimumLength=3)] //最大长度不超过20个字符,最短不能低于3个字符
(3)、RegularExpression
正则表达式能够匹配的字符串,如果不能匹配,则报一个验证错误
[RegularExpression(@"[A-Za-z0-9.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}")]
(4)、Range
Range特性用来指定数值类型值的最小值和最大值。
[Range(35,44)] //整型,最小35,最大44
[Range(typeof(decimal),"0.00","49.99")] //decimal类型
(5)、Remote
允许利用服务器端的回调函数执行客户端的验证逻辑。说白了就是支持AJAX验证。
这个写个异步验证用户名是否存在的DEMO:


[Required]

[Remote("CheckUserName", "Home")]

public string UserName

{
get;
set;
}

Controller代码:


public JsonResult CheckUserName(string UserName)

{
bool result = true;
if (UserName == "admin")
{
result = false;
}
return Json(result,JsonRequestBehavior.AllowGet);
}

显示结果:
(6)、Compare
用于确保模板对象的两个对象拥有相同的值。
例如,通常输入密码之后还要求用户再次确认密码,这时候就是Compare属性发挥作用的时候了。
[Compare("要对比的属性名")]
2、自定义错误提示消息
每个特性都允许传递一个带有自定义错误提示消息的参数。


[Required(ErrorMessage="用户名必须填写")]

[Remote("CheckUserName", "Home",ErrorMessage="此用户名已存在")]

public string UserName

{
get;
set;
}

自定义错误消息,还有一个格式项,如


[Required(ErrorMessage="{0}必须填写")]

publit string Name

{
get;
set;
}

则{0}在输入的时候会被Name替换。
如果以上的验证方式还不够,你还可以自定义验证
3、显示和编辑注解
(1)、Display
如果使用的是直接EditorForModel实现的话,Display特性可以帮助你设置友好的显示名称
例如:
[Display(Name="密码")]
public string PassWord { get; set; }
(2)、ScaffoldColumn
隐藏Html辅助方法(如EditorForModel,DisplayForModel)显示一些属性。
[ScaffoldColumn(false)] //不显示该属性的编辑框
public string UserName { get; set; }
虽然ScaffoldColumn可以做到不显示一些属性在页面上被编辑,但是如果提交的Form有这个属性值,模型绑定机制依然会绑定此属性值。要解除就要显式的[Bind]了,这个与本篇无关。此处不提。
(3)、DisplayFormat
DisplayFormat特性可以用来处理属性的各种格式化选项。当属性包含空值时,可以提供可选的显示文本,也可以为包含标记的属性关闭HTML编码,还可以为运行时指定一个应用于属性值的格式化字符串。
例如:
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c}")]
public decimal money { get; set; }
这样,当有初始值的时候,显示的代码将所示:
注意是初始值,如果是直接填写的并不会有符号。来看Controller中设置的初始值:


public ActionResult PersonAdd()

{
Person_Model p = new Person_Model();
p.money = 12.10M;
return View(p);
}

此显示样式在提交回Controller中是没用的,因为模型绑定器将不能解析返回的价格值。怎么用自己斟酌,用于显示还是OK的。
(4)、ReadOnly
如果确保默认的模型绑定器不使用请求中的新值更新属性,可以给属性添加ReadOnly特性:
[ReadOnly(true)]
public string Name { get; set; }
注意,此属性仍然会显示一个可编辑的文本框来显示Name,但是模型绑定器不会接收其值,因此只有模型绑定器考虑ReadOnly属性。
(5)、DataType
DataType特性可以为运行时提供关于属性的特定用途的信息。
例如:
[DataType(DataType.Password)]
public string PassWord { get; set; }
该属性可以用于指定多选按钮,单选按钮,密码输入框,等等类型的数据。
(6)、UIHint
UIHint特性给Asp.net MVC运行时提供了一个模板名字,以备调用模板辅助方法如(DisplayFor和EditorFor)渲染输出时使用。也可以自定义自己的模板辅助方法来重写Asp.net MVC的默认行为。
(7)、HiddenInput
HiddentInput在名称空间System.Web.Mvc中,它可以告知运行时渲染一个type特性值为"hidden"的输入元素。说白了就是<input type="hidden" value="xxx" />
三、验证示例
1、首先新建一个MVC项目。添加如下代码,代码非常简单:一个Person_Model类


public class Person_Model

{
[Required]
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public int Age { get; set; }
}

2、Controller类代码


public class HomeController : Controller

{
public ActionResult PersonAdd()
{
return View();
}
[HttpPost]
public ActionResult PersonAdd(Person_Model model)
{
//一行代码判断验证是否通过
if (ModelState.IsValid)
{
return Redirect("/Home/PersonManager");
}
return View();
}
}

3、视图代码


@model MvcApplication1.Models.Person_Model

@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout。cshtml";
}
<form action="/Home/PersonAdd" method="post">
Id:<input type="text" name="Id" value="" />
@Html.ValidationMessageFor(Model => Model.Id) //之所以写在Person_Model的验证会显示到前端提示,主要是这种代码起的作用
<br />
姓名:<input type="text" name="Name" value="" />
@Html.ValidationMessageFor(Model => Model.Name)
<br />
年龄:<input type="text" name="Age" value="" />
@Html.ValidationMessageFor(Model => Model.Age)
<input type="submit" value="确定" />
</form>

4、执行的效果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)