前言
其实对于这块知识点,一直觉得没有必要进行总结,只是新到的公司当时用到了kendo for asp.net mvc,里面有用到,自动初始化页面,而依据基于对象属性的注解与验证,故此抽时间总计了一下吧。借鉴与《asp.net mvc 5高级编程》
验证注解的使用
数据注解定义在一般在命名空间”System.ComponentModel.DataAnnotations”提供了服务器端验证的功能,当在模型的属性上使用时,框架也支持客户端验证。在命名空间DataAnnotations总工有4个特性可以用于一般的验证场合。
1.Required强调不能为空
[Required(ErrorMessage
="{0}不能为空")]
publicGuid BID {get;set; }
2.StringLength控制字段长度
[StringLength(4000, MinimumLength =1,
ErrorMessage ="{0}长度在{2}-{1}之间")]
publicString Enclosure {get;set; }
3.RegularExpression正则表达式
[RegularExpression(@"^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+",ErrorMessage ="邮箱输入有误,重新输入。")]
publicstringEmail
{get;set; }
4.Range指定值类型的范围
[Range(35,44,ErrorMessage ="年龄不符合要求")]
publicintAge {get;set; }
5.Compare两次输入必须一致
[RegularExpression(@"^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+",ErrorMessage ="邮箱输入有误,重新输入。")]
publicstringEmail
{get;set; }
[Compare("Email ")]
publicstringEmail2 {get;set; }
6.Remote是mvc框架为应用程序在命名空间system.web.mvc额外添加的可以利用服务器端的回到函数执行客户端的验证逻辑
[Remote("CheckUserName","Admin")]
publicstringUserName {get;set; }
publicJsonResult CheckUserName(stringusername)
{
returnJson(DateTime.Now.ToString(),JsonRequestBehavior.AllowGet);
}
显示和编辑注解
1.DisplayName显示名称
[DisplayName("金额(元)")]
publicDecimal Money {get;set; }
2.ScaffoldColumn可以隐藏HTML的辅助方法
[ScaffoldColumn(false)]
publicstringUserName {get;set; }
注:虽然ScaffoldColumn可以做到不显示一些属性在页面上被编辑,但是如果提交的Form有这个属性值,模型绑定机制依然会绑定此属性值。
3.DisplayFormat处理属性的各种格式。比如日期,浮点数等
[DisplayFormat(ApplyFormatInEditMode
=true,DataFormatString ="{0:c}")]
publicdecimalTotal
{get;set; }
4.ReadOnly只读
[DisplayName("计取时间")]
[ReadOnly(true)]
publicstringRememberTime {get;set; }
5.运行时提供关于属性的特定用途信息。
[Required(ErrorMessage
="密码不能为空")]
[DataType(DataType.Password)]
publicstringPassword {get;set; }
自定义验证属性
其实这个方法就是定一个特性,进行验证。至于特性前面的文章有涉及。
下面对此的应用如下:
[SelectList("/Inspect/GetSite?all=0",
HttpVerbs.Post,
CascadeFrom="SegmentID",
DataValueField="SiteID",
DataTextField="Name",
Data=@"function(){
return { segmentId:$(""#SegmentID"").val() };
}",
DataType="DropDownList")]
[Required(ErrorMessage="{0}不能为空")]
publicGuid SiteID {get;set; }
具体实现如下
[AttributeUsage(AttributeTargets.Property,
AllowMultiple=false, Inherited=true)]
publicclassSelectListAttribute : Attribute,IMetadataAware
{
publicSelectListAttribute(stringremoteUrl, System.Web.Mvc.HttpVerbs httpVerbs =1)
{
if(remoteUrl ==null)
{
thrownewArgumentNullException("remoteUrl");
}
this.RemoteUrl
=remoteUrl;
this.HttpVerbs
=httpVerbs;
this.ServerFiltering
=true;
}
publicvoidOnMetadataCreated(ModelMetadata metadata)
{
if(metadata ==null)
{
thrownewArgumentNullException("metadata");
}
IDictionary dictionary =null;
if(!string.IsNullOrEmpty(this.AdditionalValues))
{
try
{
dictionary=this.AdditionalValues.FromJson>();
}
catch
{
dictionary=newDictionary();
}
if((dictionary !=null) && (dictionary.Count >0))
{
foreach(KeyValuePair pairindictionary)
{
metadata.AdditionalValues[pair.Key]=pair.Value;
}
}
}
metadata.AdditionalValues["RemoteUrl"] =this.RemoteUrl;
metadata.AdditionalValues["Type"] =this.HttpVerbs;
metadata.AdditionalValues["Data"] =this.Data;
metadata.AdditionalValues["ServerFiltering"] =this.ServerFiltering;
metadata.AdditionalValues["Events"] =this.ParseEvents(this.Events);
metadata.AdditionalValues["CascadeFrom"] =this.CascadeFrom;
metadata.AdditionalValues["Recursion"] =this.Recursion;
metadata.AdditionalValues["Multiple"] =this.Multiple;
metadata.AdditionalValues["DataTextField"] =this.DataTextField;
metadata.AdditionalValues["DataValueField"] =this.DataValueField;
metadata.DataTypeName=this.DataType;
}
privateIDictionary ParseEvents(stringvalue)
{
try
{
if(string.IsNullOrWhiteSpace(value))
{
value="{}";
}
returnnewDictionary(value.FromJson>(), StringComparer.OrdinalIgnoreCase);
}
catch
{
returnnewDictionary();
}
}
publicstringAdditionalValues {get;set; }
publicstringCascadeFrom {get;set; }
publicstringData {get;set; }
publicstringDataTextField {get;set; }
publicstringDataType {get;set; }
publicstringDataValueField {get;set; }
publicstringEvents {get;set; }
publicSystem.Web.Mvc.HttpVerbs HttpVerbs {get;privateset; }
publicboolMultiple {get;set; }
publicboolRecursion {get;set; }
publicstringRemoteUrl {get;privateset; }
publicboolServerFiltering {get;set; }
}
网友评论