Data Validate 之 Data Annotation

  1. 什么是Data Annotation ?
  2. 如何使用 ?
  3. 自定义Validate Attribute
  4. EF  Db first中使用Data Annotation
  5. asp.net MVC中使用Data Annotation

什么是Data Annotation ?

貌似没听过,但肯定见过

所属程序集:System.ComponentModel.DataAnnotations

DataAnnotation code:

  public class Product
    {

        [Required]
        [StringLength(10,MinimumLength =5)]
        public string Name { get; set; }

        [Required]
        public decimal? UnitPrice { get; set; }
    }

没错,就是给类的属性加上描述性的验证信息,

如何使用这些信息 为我们自己所用呢?

当然是先自己想办法了,

添加辅助类:

    public class ModelValidationError
    {
        public string FieldName { get; set; }
        public string Message { get; set; }
    }
    public static class DataAnnotationHelper
    {
        public static IEnumerable<ModelValidationError> IsValid<T>(this T o)
        {
            var descriptor = GetTypeDescriptor(typeof(T));

            foreach (PropertyDescriptor propertyDescriptor in descriptor.GetProperties())
            {
                var validations = propertyDescriptor.Attributes.OfType<ValidationAttribute>();
                foreach (var validationAttribute in validations)
                {
                    var v = propertyDescriptor.GetValue(o);

                    if (!validationAttribute.IsValid(v))
                    {
                        yield return new ModelValidationError() { FieldName = propertyDescriptor.Name, Message = validationAttribute.FormatErrorMessage(propertyDescriptor.Name) };
                    }
                }
            }
        }
        private static ICustomTypeDescriptor GetTypeDescriptor(Type type)
        {
            return new AssociatedMetadataTypeTypeDescriptionProvider(type).GetTypeDescriptor(type);
        }
    }

如何使用:

 class Program
    {
        static void Main(string[] args)
        {
            Product product = new Product();
            foreach (var item in product.IsValid())
            {
                Console.WriteLine("FieldName:{0} Error Message:{1}", item.FieldName, item.Message);
            }
            Console.ReadKey();
        }
    }

自定义ValidateAttribute

.net 提供的 ValidateAttribute不够用怎么搞?自定义呗,

    public class PriceAttribute : ValidationAttribute
    {
        public double MinPrice { get; set; } 

        public override bool IsValid(object value)
        {
            if (value == null)
            {
                return false;
            }
            var price = (double)value;

            if (price < MinPrice)
            {
                return false;
            }
            return true;
        }
        public override string FormatErrorMessage(string name)
        {
            return "Min Price is "+MinPrice;
        }
    }

使用方法和.net 提供的一样:

    public class Product
    {

        [Required]
        [StringLength(10,MinimumLength =5)]
        public string Name { get; set; }

        [Required]
        [Price(MinPrice =2)]
        public decimal? UnitPrice { get; set; }
    }

EF  Db first中使用Data Annotation

实际应用中遇到的问题:

在使用EF DBfirst的时候,实体类的validate attribute,一不小心经常会被覆盖掉,如何解决

巧妙使用partial 类

    public class ProductMetaData
    {
        [Required]
        [StringLength(10, MinimumLength = 5)]
        public string Name { get; set; }

        [Required]
        [Price(MinPrice = 2)]
        public decimal? UnitPrice { get; set; }
    }
    [MetadataType(typeof(ProductMetaData))]
    public partial class Product
    {

    }
    public partial class Product
    {
        public string Name { get; set; }

        public decimal? UnitPrice { get; set; }
    }

asp.net mvc 中data annotation的使用:

asp.net mvc中对data annotation具有原生的支持,

默认情况下,ASP.NET MVC框架在模型绑定时执行验证逻辑。

模型邦定器一旦完成对模型属性的更新,就会利用当前的模型元数据获得模型的所有验证器。这运行时提供了一个验证其 (DataAnnotationModelValidator)来与注解一同工作。这个模型验证器会找到所有的验证特性并执行它们包含的验证逻辑。 ModelBinder捕获所有失败的验证其规则并把它们放入ModelState中。

模型绑定的主要产物就是ModelState(Controller的属性)。

这个对象不仅包含了用户所有想放入模型属性里的值,也包括与每一个属性相关联的所有错误,和模型本身的错误,如果存在错误ModelState.IsValid返回false。

ModelState("LastName").Errors[0].ErrorMessage;//查看LastName属性的错误信息

View中查看:@Html.ValadationMessageFor(m=>m.LastName)

在编辑操作的PostAction中,可以先使用ModelState.IsValid属性判断是否通过验证,再不同对待。

参考文档:

http://www.asp.net/mvc/overview/older-versions-1/models-data/validation-with-the-data-annotation-validators-cs

http://www.cnblogs.com/xinchuang/archive/2013/06/06/3120482.html

http://www.cnblogs.com/kevin-kingdom/archive/2012/12/07/2807138.html

http://www.cnblogs.com/hjf1223/archive/2010/11/07/independent-dataannotation-validation.html

时间: 2024-10-06 08:23:26

Data Validate 之 Data Annotation的相关文章

Datasets for Data Mining and Data Science

From kdnuggets Data repositories AWS (Amazon Web Services) Public Data Sets, provides a centralized repository of public data sets that can be seamlessly integrated into AWS cloud-based applications. BigML big list of public data sources. Bioassay da

ELK之kibana的web报错[request] Data too large, data for [&lt;agg [2]&gt;] would be larger than limit of

ELK架构:elasticsearch+kibana+filebeat 版本信息: elasticsearch 5.2.1 kibana 5.2.1 filebeat 6.0.0 (预览版) 今天在进行ELK测试的时候,在kibana上面discover无论那个index,发现均会报错: [request] Data too large, data for [<agg [2]>] would be larger than limit of 并且在elasticsearch的日志可以看到: or

Big Data Analytics and Data Mining 第一天.

今天是上课的第一天.真心很感激导师能让我出来学习.今天突然觉得自己要好好学习英语.并不是上课的时候我看不懂裴教授的课件.而是觉得如果英语不好就很像乡巴佬那样,很难接触到高级的东西. 通过今天的听讲,我感觉对数据挖掘的理解更深刻些. 以前总觉得自己研究生的目标是要好好学习算法,好好学习相关的技术. 现在觉得除了要好好学习算法外,我也期待自己能做出一些研究. 记录下今天讲课的内容. 今天我觉得主要讲了三部分: 1,数据挖掘相关的概念及相关的学术期刊. 从广义上来定义数据挖掘:The art of d

初探 spring data(一)--- spring data 概述

由于自己一个项目要用多到Sql与NoSql两种截然不同的数据结构,但在编程上我希望统一接口API,让不同类型的数据库能在相同的编程接口模式下运作.于是找了一个spring的官网,发现一个spring data的项目.Spring Data 统一所有访问数据库的接口,为开发者提供一个更加简便的开发方式  Spring Data 官网 下面是几个核心的项目介绍 Spring Data Commons - 每个Spring Data 项目的核心基础 (因此每一个Spring Data项目都使用统一的接

SQL data reader reading data performance test

/*Author: Jiangong SUN*/ As I've manipulated a lot of data using SQL data reader in recent project. And people says it's not good to access the data by column name. So I've made an performance test in reading data from SQL data reader. Firstly, I've

Ajax retrieve JSON data and Html data from MVC Controllers in ASP.NET MVC

一. 准备好后台测试数据,过程略 二.客户端处理 @{ ViewBag.Title = "Index"; } <h2>Ajax Demo</h2> <div style="width: 600px; "> <div style="background-color:lightgray"> <h2>Meals</h2> </div> <p>Click th

关于 Data URI Scheme -- data:image/jpg;base64

转载一篇大神的文章 大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如: data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAeAAD/7gAOQWRvYmUAZMAA= //这是随便写的,不要访问 什么是DATA URI Scheme呢? 其实就是形如data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAA

ARM MAP文件解析(1)-Code (inc. data)、RO Data、RW Data、ZI Data、Debug

From:http://www.keil.com/support/man/docs/armlink/armlink_pge1362065942464.htm 5.3 Example of using the --info linker option This is an example of the output generated by the --info option To display the component sizes when linking enter: armlink --

valueError: This solver needs samples of at least 2 classes in the data, but the data contains only one class: 0

问题描述:执行下面的代码,报错valueError: This solver needs samples of at least 2 classes in the data, but the data contains only one class: 0 原因:数据量太少 解决方案:增加训练数据量 代码如下: filename = "test.csv" data = pd.read_csv(filename,sep=' ') data = pd.DataFrame(data) x =