asp.net core集成了非常方便的数据绑定和数据校验机制,配合操作各种easy的vs,效率直接高到飞起。

通过自定义验证特性(Custom Validation Attribute)可以实现对于数据校验规则的极大扩展。

最近在写前后端自定义验证的时候,尝试换了一种思路,这里做简单记录:

> 一般而言,我们在自定义一个验证特定的时候,会继承ValidationAttribute

> 之后如果只 override bool IsValid(object value) 则仅实现后端校验,无法实现前端校验

> 如果要实现前端校验,则步骤会更加复杂:

>> 首先额外继承IClientModelValidator接口

>> 实现 void AddValidation(ClientModelValidationContext context) 方法,并填充内容

>> 还不算完,我们还得额外再补充jquery的前端校验方法:

>>> $.validator.addMethod

>>> $.validator.unobtrusive.adapters.add

这是asp.net core 自定义特性实现双端校验的标配步骤,可以参考dudu站长的这篇文章:https://www.cnblogs.com/dudu/p/6812715.html

一直感觉这些步骤相对繁琐,单独的后端校验和jquery前端校验都很简单,既然俩适配到一起这么麻烦为啥不分开写?

首先自定义特性仅实现后端验证:

public class SimpleTestAttribute : ValidationAttribute
{
private static readonly Regex _noSpaceRegex = new Regex(@"/^[0-9]*$/", RegexOptions.Compiled); public override bool IsValid(object value)
{
string stringValue = Convert.ToString(value, CultureInfo.CurrentCulture); if (string.IsNullOrEmpty(stringValue))
{
return true;
} return _noSpaceRegex.IsMatch(stringValue);
}
}

然后model字段添加特性标签:

[SimpleTest(ErrorMessage = "请输入大于0的数字")]
public string validtest { get; set; }

之后是视图层代码:

            <div class="form-group">
<label asp-for="validtest" class="control-label"></label>
<input asp-for="validtest" class="form-control simpletest"/> <!-- 注意 simpletest 写到class里 -->
<span asp-validation-for="validtest" class="text-danger"></span>
</div>

以及视图层jquery单独前端校验的脚本:

@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");} <script type="text/javascript">
$(function () {
$.validator.addMethod("simpletest", function (value, element) {
var score = /^[0-9]*$/;
return this.optional(element) || (score.test(value));
}, "请输入大于0的数字");
});
</script>
}

最后是Controller实现:

        [HttpPost]
public IActionResult Edit(EditModel model)
{
if (!ModelState.IsValid)
{
return View(); // 显示后端校验提示信息
}
return RedirectToAction("Index");
}

自定义特性只校验后端,前端用原始jquery代码写就好,感觉这样思路反倒更清晰(?捂脸。。)

欢迎各路大神赐教拍砖

Asp.net core通过自定义特性实现双端数据验证的一些想法的更多相关文章

  1. asp.net core mvc视频A:笔记4-1.数据验证

    开发建议:永远不要相信客户端提交过来的数据!!! 前端数据验证定位:提高用户体验,仅此而已! 后端数据验证定位:保证系统安全与数据完整!!! 实例:用户登录验证 定义一个用户登录类 在用户登录类基础上 ...

  2. ASP.NET Core MVC – 自定义 Tag Helpers

    ASP.NET Core Tag Helpers系列目录,共四篇: ASP.NET Core MVC Tag Helpers 介绍 ASP.NET Core MVC – Caching Tag Hel ...

  3. .Net Core 2.0生态(3):ASP.NET Core 2.0 特性介绍和使用指南

    ASP.NET Core 2.0 发布日期:2017年8月14日 ASP.NET团队宣布ASP.NET Core 2.0正式发布,发布Visual Studio 2017 15.3支持ASP.NET ...

  4. 如何在ASP.NET Core中自定义Azure Storage File Provider

    文章标题:如何在ASP.NET Core中自定义Azure Storage File Provider 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p ...

  5. ASP.NET Core Identity自定义数据库结构和完全使用Dapper而非EntityFramework Core

    前言 原本本节内容是不存在的,出于有几个人问到了我:我想使用ASP.NET Core Identity,但是我又不想使用默认生成的数据库表,想自定义一套,我想要使用ASP.NE Core Identi ...

  6. asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密。

    原文:asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密. GitHub demo https://github.com/zhanglilong23/Asp.NetCore. ...

  7. ASP.NET Core教程【二】从保存数据看特有属性与服务端验证

    前文索引: 在layout.cshtml文件中,我们可以看到如下代码: <a asp-page="/Index" class="navbar-brand" ...

  8. ASP.NET Core教程【二】从保存数据看Razor Page的特有属性与服务端验证

    前文索引:ASP.NET Core教程[一]关于Razor Page的知识 在layout.cshtml文件中,我们可以看到如下代码: <a asp-page="/Index" ...

  9. ASP.NET Core 中间件自定义全局异常处理

    目录 背景 ASP.NET Core过滤器(Filter) ASP.NET Core 中间件(Middleware) 自定义全局异常处理 .Net Core中使用ExceptionFilter .Ne ...

随机推荐

  1. 移动端学习之理解WEB APP、Native APP、Hybrid APP以及React Native/uniapp包括H5、小程序等的区别与共通之处

    因为工作需要,需要进一步了解移动端的开发,遂返回复习移动端的知识点,在开始学习之前,产生了疑惑WEB APP .Native APP .Hybrid APP.React Native.Uniapp.H ...

  2. JavaScript同步模式,异步模式及宏任务,微任务队列

    首先JavaScript是单线程的语言,也就是说JS执行环境中,负责执行代码的线程只有一个.一次只能执行一个任务,如果有多个任务的话, 就要排队,然后依次执行,优点就是更安全,更简单.缺点就是遇到耗时 ...

  3. JButton的常用方法

    JButton 实现了普通的三态外加选中.禁用状态,有很多方法可以设置,不要自己去写鼠标监听器.setBorderPainted(boolean b)    //是否画边框,如果用自定义图片做按钮背景 ...

  4. express安装问题

    步骤1 npm install -g express(全局安装express) (安装node就不必说了) 步骤2 npm install -g express-generator(安装命令工具) 完 ...

  5. 百度智能(文本识别),API传图OC代码与SDK使用

    百度智能中的文本识别中的身份证识别,有API方式和SDK方式 API方式 百度智能(文本识别),百度API传图没有提供OC的示例,这里提供一下 - (void)OCTest:(NSString*)to ...

  6. mysql 需要内核级线程的支持,而不只是用户级线程,这样才能够有效的使用多个cpu

    mysql 需要内核级线程的支持,而不只是用户级线程,这样才能够有效的使用多个cpu

  7. 【Jboss】A RESOURCE POOL IS PERMANENTLY BROKEN!

    jboss后台报错,其中有这个错误 [error] A RESOURCE POOL IS PERMANENTLY BROKEN! 查阅多方资料后发现.数据库连接配置文件中,有地方存在空格,导致服务连接 ...

  8. oracle常见进度查询脚本

    1.查看索引创建进度 /* Formatted on 2019/8/20 下午 05:08:25 (QP5 v5.163.1008.3004) */ SELECT SID, DECODE (total ...

  9. 1.5V升5V芯片,1.5V升5V电路图规格书

    常用的 5号,7号等 1.5V 干电池满电电压在 1.6V 左右,干电池输出耗电电压在 1V.适用PW5100,在 0.9V 时还能输出,彻底榨干干电池的电量. 1.5V 升5V 的芯片:PW5100 ...

  10. 零基础怎么学Python编程,新手常犯哪些错误?

    Python是人工智能时代最佳的编程语言,入门简单.功能强大,深获初学者的喜爱. 很多零基础学习Python开发的人都会忽视一些小细节,进而导致整个程序出现错误.下面就给大家介绍一下Python开发者 ...