Asp.net core通过自定义特性实现双端数据验证的一些想法
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通过自定义特性实现双端数据验证的一些想法的更多相关文章
- asp.net core mvc视频A:笔记4-1.数据验证
开发建议:永远不要相信客户端提交过来的数据!!! 前端数据验证定位:提高用户体验,仅此而已! 后端数据验证定位:保证系统安全与数据完整!!! 实例:用户登录验证 定义一个用户登录类 在用户登录类基础上 ...
- ASP.NET Core MVC – 自定义 Tag Helpers
ASP.NET Core Tag Helpers系列目录,共四篇: ASP.NET Core MVC Tag Helpers 介绍 ASP.NET Core MVC – Caching Tag Hel ...
- .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 ...
- 如何在ASP.NET Core中自定义Azure Storage File Provider
文章标题:如何在ASP.NET Core中自定义Azure Storage File Provider 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p ...
- ASP.NET Core Identity自定义数据库结构和完全使用Dapper而非EntityFramework Core
前言 原本本节内容是不存在的,出于有几个人问到了我:我想使用ASP.NET Core Identity,但是我又不想使用默认生成的数据库表,想自定义一套,我想要使用ASP.NE Core Identi ...
- asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密。
原文:asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密. GitHub demo https://github.com/zhanglilong23/Asp.NetCore. ...
- ASP.NET Core教程【二】从保存数据看特有属性与服务端验证
前文索引: 在layout.cshtml文件中,我们可以看到如下代码: <a asp-page="/Index" class="navbar-brand" ...
- ASP.NET Core教程【二】从保存数据看Razor Page的特有属性与服务端验证
前文索引:ASP.NET Core教程[一]关于Razor Page的知识 在layout.cshtml文件中,我们可以看到如下代码: <a asp-page="/Index" ...
- ASP.NET Core 中间件自定义全局异常处理
目录 背景 ASP.NET Core过滤器(Filter) ASP.NET Core 中间件(Middleware) 自定义全局异常处理 .Net Core中使用ExceptionFilter .Ne ...
随机推荐
- spark:distinct算子实现原理
distinct的底层使用reducebykey巧妙实现去重逻辑 //使用reduceByKey或者groupbykey的shuffle去重思想rdd.map(key=>(key,null)). ...
- Python pip install 默认路径修改。
pip动不动就下载数百M的文件.这些文件默认在C:盘,那么为了节省空间需要修改这些路径: 打开cmd命令窗口.输入: python -m site C:\Users\hewei>python - ...
- LeetCode383. 赎金信
题目 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成.如果可以构成,返回 tru ...
- 攻防世界 - Web(一)
baby_web: 1.根据题目提示,初始页面即为index,将1.php改为index.php,发现依然跳转成1.php,尝试修改抓包,出现如下回显, 2.在header中获取flag, flag: ...
- CTFhub刷题记录
一 [WesternCTF2018]shrine 没什么好说的,SSTI模版注入类问题,过滤了()但是我们不慌.开始注入,{{29*3}}测试通过. 发现是jinjia2的模版注入.关键点在于没有() ...
- eCATT使用前的配置
如果想在SAP中使用eCATT,必须做一下相关的配置才行,下面简单介绍这几步:1.SM30,输入表T000,然后点击维护,或者是进入事物SCC4,进入对应的clint属性编辑视图下,将CATT and ...
- SP338 ROADS
题目描述 城市中有R条有向马路,n个马路连接点,通过每条马路都要花去一定费用.你现在在编号为1的连接点 ,手里有k元钱,要去n号连接点的最短路径的长度是多少?途中经过道路的花费不能超过k.注意:两个 ...
- 转 3 jmeter的两种录制方法
录制1-badboy(推荐) badboy是一款自动化测试工具,它可以完成简单的功能测试和性能测试.其实它是一款独立的测试工具,只不过它录制东西导出的格式适用于jmeter,所以我们经常把jmet ...
- pytest:conftest.py文件
一.fixture scope 为session 级别是可以跨 .py模块调用的,也就是当我们有多个 .py文件的用例时,如果多个用例只需调用一次fixture,可以将scope='session', ...
- SICP 解题集 — SICP 解题集 https://sicp.readthedocs.io/en/latest/
SICP 解题集 - SICP 解题集 https://sicp.readthedocs.io/en/latest/