基础拾遗-----数据注解与验证

前言

其实对于这块知识点,一直觉得没有必要进行总结,只是新到的公司当时用到了 kendo for asp.net mvc ,里面有用到,自动初始化页面,而依据基于对象属性的注解与验证,故此抽时间总计了一下吧。借鉴与《asp.net mvc 5高级编程》

验证注解的使用

数据注解定义在一般在命名空间”System.ComponentModel.DataAnnotations”提供了服务器端验证的功能,当在模型的属性上使用时,框架也支持客户端验证。在命名空间DataAnnotations总工有4个特性可以用于一般的验证场合。

1.Required 强调不能为空

[Required(ErrorMessage = "{0}不能为空")]
public Guid BID { get; set; }

2.StringLength控制字段长度

 [StringLength(4000, MinimumLength = 1, ErrorMessage = "{0}长度在{2}-{1}之间")] 
 public String Enclosure { get; set; }

3.RegularExpression正则表达式

[RegularExpression(@"^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+",ErrorMessage = "邮箱输入有误,重新输入。")]        
public string Email { get; set; }

4.Range指定值类型的范围

[Range(35,44,ErrorMessage = "年龄不符合要求")]
 public int Age { get; set; }

5.Compare两次输入必须一致

[RegularExpression(@"^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+",ErrorMessage = "邮箱输入有误,重新输入。")]        
public string Email { get; set; }
[Compare("Email ")]
public string Email2 { get; set; }

6.Remote 是mvc框架为应用程序在命名空间system.web.mvc额外添加的可以利用服务器端的回到函数执行客户端的验证逻辑

[Remote("CheckUserName", "Admin")]
public string UserName { get; set; }
public JsonResult CheckUserName(string username)
{
 return Json(DateTime.Now.ToString(),JsonRequestBehavior.AllowGet);
}

显示和编辑注解

1.DisplayName显示名称

  [DisplayName("金额(元)")]
  public Decimal Money { get; set; }

2.ScaffoldColumn可以隐藏HTML的辅助方法

[ScaffoldColumn(false)]
public string UserName { get; set; }

注:虽然ScaffoldColumn可以做到不显示一些属性在页面上被编辑,但是如果提交的Form有这个属性值,模型绑定机制依然会绑定此属性值。

3.DisplayFormat处理属性的各种格式。比如日期,浮点数等

[DisplayFormat(ApplyFormatInEditMode = true,DataFormatString = "{0:c}")]
public decimal Total { get; set; }

4.ReadOnly只读

        [DisplayName("计取时间")]
        [ReadOnly(true)]
        public string RememberTime { get; set; }

5.运行时提供关于属性的特定用途信息。

[Required(ErrorMessage = "密码不能为空")]
[DataType(DataType.Password)]
public string Password { 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}不能为空")]
        public Guid SiteID { get; set; }

具体实现如下

[AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=true)]
    public class SelectListAttribute : Attribute, IMetadataAware
    {
        public SelectListAttribute(string remoteUrl, System.Web.Mvc.HttpVerbs httpVerbs = 1)
        {
            if (remoteUrl == null)
            {
                throw new ArgumentNullException("remoteUrl");
            }
            this.RemoteUrl = remoteUrl;
            this.HttpVerbs = httpVerbs;
            this.ServerFiltering = true;
        }
        
        public void OnMetadataCreated(ModelMetadata metadata)
        {
            if (metadata == null)
            {
                throw new ArgumentNullException("metadata");
            }
            IDictionary<string, string> dictionary = null;
            if (!string.IsNullOrEmpty(this.AdditionalValues))
            {
                try
                {
                    dictionary = this.AdditionalValues.FromJson<IDictionary<string, string>>();
                }
                catch
                {
                    dictionary = new Dictionary<string, string>();
                }
                if ((dictionary != null) && (dictionary.Count > 0))
                {
                    foreach (KeyValuePair<string, string> pair in dictionary)
                    {
                        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;
        }
        
        private IDictionary<string, string> ParseEvents(string value)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(value))
                {
                    value = "{}";
                }
                return new Dictionary<string, string>(value.FromJson<IDictionary<string, string>>(), StringComparer.OrdinalIgnoreCase);
            }
            catch
            {
                return new Dictionary<string, string>();
            }
        }
        
        public string AdditionalValues { get; set; }
        
        public string CascadeFrom { get; set; }
        
        public string Data { get; set; }
        
        public string DataTextField { get; set; }
        
        public string DataType { get; set; }
        
        public string DataValueField { get; set; }
        
        public string Events { get; set; }
        
        public System.Web.Mvc.HttpVerbs HttpVerbs { get; private set; }
        
        public bool Multiple { get; set; }
        
        public bool Recursion { get; set; }
        
        public string RemoteUrl { get; private set; }
        
        public bool ServerFiltering { get; set; }
    }

至于特性请参考以前的文章:基础拾遗------特性详解

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

c# 温故而知新: 线程篇(一) 下

Abort 方法: 其实 Abort 方法并没有像字面上的那么简单,释放并终止调用线程,其实当一个线程调用 Abort方法时,会在调用此方法的线程上引发一个异常...

26960
来自专栏大内老A

ASP.NET MVC是如何运行的[2]: URL路由

在一个ASP.NET MVC应用来说,针对HTTP请求的处理和相应定义Controller类型的某个Action方法中,每个HTTP请求的目标对象不再像ASP ...

22350
来自专栏跟着阿笨一起玩NET

C# 中参数验证方式的演变

一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型...

15620
来自专栏NetCore

[原创]Fluent NHibernate之旅(四)-- 关系(中)

接着上一篇,我们继续讲解ORM中的关系。在数据库设计中,我们最多打交道的,要算一对多关系了,延续我们的示例,我们来讲解一下一对多的关系。 Fluent NHib...

219100
来自专栏大内老A

像TransactionScope一样使用DbTransaction

System.Transactions.TransactionScope为了提供一种非常方便的实现分布式事务的方式,但是在某些情况下为了阻止本地事务向分布式事务...

53970
来自专栏Java成神之路

Java微信公众平台开发_05_微信网页授权

登录微信公众平台后台, 开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息 - 修改,

1.6K30
来自专栏圣杰的专栏

ABP入门系列(4)——创建应用服务

一、解释下应用服务层 应用服务用于将领域(业务)逻辑暴露给展现层。展现层通过传入DTO(数据传输对象)参数来调用应用服务,而应用服务通过领域对象来执行相应的业务...

32370
来自专栏大内老A

让我们的ASP.NET MVC应用可以单独维护验证消息

在项目开发中,我们会使用到很多的描述性文字,比如验证消息、错误消息和确认消息等,让这些文本消息具有可维护性具有重要的意义。虽然我们可以将它们存储于资源文件中,并...

20970
来自专栏向治洪

android 的android httpClient详解

AndroidHttpClient结构: public final class AndroidHttpClient extends Object imple...

23650
来自专栏程序员的SOD蜜

DataSet的灵活,实体类的方便,DTO的效率:SOD框架的数据容器,打造最适合DDD的ORM框架

引言:DDD的困惑 最近,我看到园子里面有位朋友的一篇博客 《领域驱动设计系列(一):为何要领域驱动设计? 》文章中有下面一段话,对DDD使用产生的疑问: •没...

39290

扫码关注云+社区

领取腾讯云代金券