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. 电商平台战 运营是关键
  2. 刚学会深拷贝一个对象,学妹却问我怎么深拷贝一个图
  3. 蓝鸥Unity开发基础——Switch语句学习笔记
  4. P2617 Dynamic Rankings(整体二分)
  5. headerIP php_PHP curl伪造IP地址和header信息代码实例
  6. mybatis依赖_这大概就是公司一直用Mybatis的原因!真的太强了
  7. ajax mvc3 razor 分页
  8. 解决Fast api打印两次日志的问题
  9. 60-100-028-使用-MySQL 主从复制
  10. (day 38 - 双指针) 剑指 Offer 52. 两个链表的第一个公共节点
  11. redmi_flash刷机之刷入第三方rec(recovery)TWRP_(2021.9.20实践)_以老旧机型redmi4x为例..待上传
  12. Ubuntu翻译PDF论文
  13. 怎样永久关闭Win10自动更新_win10官网
  14. Apache Ant 安装教程
  15. 太阳直射点纬度计算公式_计算太阳高度角和太阳方位角确定太阳在天空中的位置...
  16. mui用ajax服务器交互,Mui --- app与服务器之间的交互原理、mui ajax使用
  17. 如何在CentOS 7上安装Elasticsearch,Logstash和Kibana(ELK堆栈)
  18. PHP自学---黑马程序员笔记【持续更新】
  19. Validation框架的应用
  20. ICCV 2019 Vehicle Re-identification with Viewpoint-aware Metric Learning

热门文章

  1. 百家号关键词优化怎么做排名的价格是多少钱
  2. UCloud杨镭:贴近用户需求做研发,将“云”简单化...
  3. Junit —— 单元测试工具基本使用
  4. 英特尔 ncs2_带有英特尔神经计算棒2 ncs2的图像分类管道
  5. pipe 导致的 CLOSE_WAIT
  6. 【多级分销,如何更有效的查找上级/下级】
  7. Python3《机器学习实战》学习笔记(七):Logistic回归实战篇之预测病马死亡率
  8. 教育培训学校公众号版v1.3.4
  9. 专利搜索方法-专利检索网站使用方法
  10. Excle如何编程(写循环进行计算)