ASP.NET MVC3新增了许多新特性,IValidatableObject接口就是新增的诸多特性之一。ASPNET MBC3该书中是这样描述的:IValidatableObject 接口允许执行 Model 水平的验证,并且允许你提供整个模型状态的验证错误信息,或者基于 Model 的两个属性。当 Model 绑定的时候,MVC3 从 IValidatableObject 接收错误信息,在视图中使用内建的 HTML 助手时,将会自动标识或者高亮受影响的字段。

可能有人会问了,Mvc2中可以使用自定义验证来对模型进行验证,为什么mvc3中又新增了IValidatableObject这个接口呢?

不错,我们是可以通过继承ValidationAttribute类并且重写它的IsValid方法来自定义验证,但是这中做法有个局限性,那就是如果我需要验证模型的各个属性之间的逻辑关系,例如:我们有一个商品模型,我们要求这个模型的出库数量不能大于库存数量,那么自定义验证就显得不是那么给力了,这时候我们就需要ValidationAttribute接口了。

首先我们这个商品模型Product.cs需要实现IValidatableObject接口,然后实现Validate这个方法。

1:medel 类

 public class Product : IValidatableObject{/// <summary>/// 产品名称/// </summary>[DisplayName("产品名称")][AllowHtml]//允许输入html脚本[Required]public String Name { get; set; }/// <summary>/// 库存数量/// </summary>[DisplayName("库存")][Required]public int Inventory { get; set; }/// <summary>/// 销售数量/// </summary>[DisplayName("售出")][Required]public int Shipping { get; set; }public IEnumerable<ValidationResult> Validate(ValidationContext validationContext){Type type = typeof(Product);EntityAttribute entityAttribute = new EntityAttribute(type);PropertyInfo[] PropertyInfos = type.GetProperties();string shippingDisplayName = entityAttribute.GetDisplayAttributeName("Shipping");string inventoryDisplayName = entityAttribute.GetDisplayAttributeName("Inventory");if (Shipping > Inventory){yield return new ValidationResult(string.Format("{0}数量不能大于{1}数量", shippingDisplayName, inventoryDisplayName), new string[] { "Shipping" });}}}

2:属性帮助类:

  /// <summary>/// 获取 Model 的  Attribute   DisplayName/// </summary>public class EntityAttribute{private Type type;public EntityAttribute(Type type){this.type = type;}public string GetDisplayAttributeName(string propertyName){var propertyInfo = type.GetProperty(propertyName);object[] attrs = propertyInfo.GetCustomAttributes(typeof(DisplayNameAttribute), true);return (attrs[0] as DisplayNameAttribute).DisplayName;}}

3:cshtml代码

@model vue3mvc.Models.Product
@{ViewData["Title"] = "MyProduct";
}
<h1>MyProduct</h1><h4>Product</h4>
<hr />
<div class="row"><div class="col-md-4"><form asp-action="MyProduct" asp-controller="Home"><div asp-validation-summary="ModelOnly" class="text-danger"></div><div class="form-group"><label asp-for="Name" class="control-label"></label><input asp-for="Name" class="form-control" /><span asp-validation-for="Name" class="text-danger"></span></div><div class="form-group"><label asp-for="Inventory" class="control-label"></label><input asp-for="Inventory" class="form-control" /><span asp-validation-for="Inventory" class="text-danger"></span></div><div class="form-group"><label asp-for="Shipping" class="control-label"></label><input asp-for="Shipping" class="form-control" /><span asp-validation-for="Shipping" class="text-danger"></span></div><div class="form-group"><input type="submit" value="Create" class="btn btn-primary" /></div></form></div>
</div><div><a asp-action="Index">Back to List</a>
</div>@section Scripts {@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}}

mvc model类添加验证功能相关推荐

  1. thinkphp回调的php调用db类,请问thinkphp中model类自动完成功能 回调函数能不能获取其他字段的值?...

    http://www.thinkphp.cn/api/source-class-Model.html#975 protected function _validationFieldItem($data ...

  2. MVC Model验证总结 @Html.ValidationSummary(true)

    原文:https://blog.csdn.net/wybshyy/article/details/52064253 ASP.NET MVC3中的Model是自验证的,这是通过.NET4的System. ...

  3. PHP的ECSHOP商城的改造成MVC添加商品功能总结

    PHP的ECSHOP商城的改造成MVC添加商品功能总结原始的ECSHOP商城不是MVC的架构,改造成MVC架构. admin后台 Platform =back,登录页面进去是index.php,里面是 ...

  4. php 自动验证表单类,thinkPHP 表单自动验证功能

    昨天晚上我们老大叫我弄表单自动验证功能,愁了半天借鉴了好多官网的知识,才出来,诶,总之分享一下我自己的成果吧! thinkphp 在Model基类为我们定义了自动验证的函数和正则表达式,我们只需要在对 ...

  5. 【转】【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式

    本文属转载,来源:http://www.byywee.com/page/M0/S868/868615.html关于Model验证官方资料:http://msdn.microsoft.com/zh-cn ...

  6. python 装饰器实现事件绑定_Python装饰器实现几类验证功能做法实例

    最近新需求来了,要给系统增加几个资源权限.尽量减少代码的改动和程序的复杂程度.所以还是使用装饰器比较科学 之前用了一些登录验证的现成装饰器模块.然后仿写一些用户管理部分的权限装饰器. 比如下面这种 调 ...

  7. ASP.NET MVC 4 (十) 模型验证

    模型验证是在模型绑定时检查从HTTP请求接收的数据是否合规以保证数据的有效性,在收到无效数据时给出提示帮助用户纠正错误的数据. 显式模型验证 验证数据最直接的方式就是在action方法中对接收的数据验 ...

  8. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序使用高级功能...

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第十二篇:为ASP.NET MVC应用程 ...

  9. MVC HtmlHelperTModel 类

    HtmlHelper<TModel> 类 .NET Framework 4 表示支持在强类型视图中呈现 HTML 控件. 继承层次结构 System.Object System.Web.M ...

最新文章

  1. Spring源码分析【6】-ThreadLocal的使用和源码分析
  2. CodeforcesBeta Round #19 D. Points 离线线段树 单点更新 离散化
  3. 网易云音乐音视频算法的 Serverless 探索之路
  4. 请编写一个 C 函数,该函数给出一个字节中8二进制数中为1的个数
  5. JeecgBoot 3.1.0 版本发布,基于代码生成器的企业级低代码平台
  6. 这两天有点热吆,star直线上涨!~Jeecg Boot
  7. java nextbyte()_java.util.Scanner.hasNextByte()方法实例
  8. Node.js下载安装及各种npm、cnpm、nvm、nrm配置(保姆式教程—提供全套安装包)—cnpm的安装与配置(3)
  9. 力扣 双周赛补题 2086. 从房屋收集雨水需要的最少水桶数
  10. javaweb实训第一天作业练习
  11. java createcustomcursor,CustomCursor插件:自定义你的鼠标光标
  12. mongodb导入bson文件_分布式文档存储数据库之MongoDB备份与恢复
  13. GNN + Zero-shot
  14. 阿里巴巴“牛逼”了,申请“行政干预”区块链专利
  15. 第十七届全国大学生智能汽车竞赛讯飞-家庭服务机器人挑战赛全国选拔赛规则
  16. 微软2019 Windows 10更新五月版:10个不可错过的新功能
  17. tensorflow安装 报错ConnectionResetError(10054, ‘远程主机强迫关闭了一个现有的连接。
  18. 图形推理题 答案揭晓
  19. python-matplotlib-箱线图为不同的箱体设置不同颜色
  20. 关于DBA或SA这个职业的讨论

热门文章

  1. 星载激光雷达的数据读取与显示
  2. [转载]王淮:我在Facebook的十点经验分享
  3. Framework 重装
  4. 【Java8 新特性 4】java8 optional
  5. 【机器学习】SVM支持向量机在手写体数据集上进行二分类、采⽤ hinge loss 和 cross-entropy loss 的线性分类模型分析和对比、网格搜索
  6. 生信人一口气搞定SCI作图与数据处理的技巧,就靠这个免费在线工具了!
  7. 关于wampserver图标变绿的问题
  8. 宝可梦探险寻宝料理php,宝可梦探险寻宝料理怎样搭配_宝可梦探险寻宝料理配方搭配方式详解_玩游戏网...
  9. 面向对象期末任务第二阶段
  10. 二代身份证号码验证器[超简单]