这是我们在实际ASP.NET Core项目中用到的,验证用户名中是否包含空格。

开始是这么实现的(继承ValidationAttribute,重写IsValid方法):

public class NoSpaceAttribute : ValidationAttribute
{
private static readonly Regex _noSpaceRegex = new Regex(@"^[^\s]+$", 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);
}
}

但发现这样只对服务端验证有效,对前端验证无效。查资料后知道原来还需要实现 IClientModelValidator 接口(需要安装nuget包——Microsoft.AspNetCore.Mvc.Abstractions):

public class NoSpaceAttribute : ValidationAttribute, IClientModelValidator
{
//... public void AddValidation(ClientModelValidationContext context)
{
MergeAttribute(context.Attributes, "data-val", "true");
var errorMessage = FormatErrorMessage(context.ModelMetadata.GetDisplayName());
MergeAttribute(context.Attributes, "data-val-nospace", errorMessage);
} private bool MergeAttribute(
IDictionary<string, string> attributes,
string key,
string value)
{
if (attributes.ContainsKey(key))
{
return false;
}
attributes.Add(key, value);
return true;
}
}

这样依然不够,还需要添加真正干活的前端验证js代码:

$(function ($) {
$.validator.addMethod("nospace",
function (value, element, parameters) {
return /^[^\s]+$/g.test(value);
}); $.validator.unobtrusive.adapters.addBool("nospace");
}(jQuery));

经过这3步,就可以正常进行前后端双重验证。

【参考资料】

Validation using IClientModelValidator

ASP.Net Core MVC - Client-side validation for custom attribute

在ASP.NET Core中实现自定义验证特性(Custom Validation Attribute)的更多相关文章

  1. ASP.NET Core中使用自定义验证属性控制访问权限

    在应用中,有时我们需要对访问的客户端进行有效性验证,只有提供有效凭证(AccessToken)的终端应用能访问我们的受控站点(如WebAPI站点),此时我们可以通过验证属性的方法来解决. 一.publ ...

  2. ASP.NET Core中显示自定义错误页面-增强版

    之前的博文 ASP.NET Core中显示自定义错误页面 中的方法是在项目中硬编码实现的,当有多个项目时,就会造成不同项目之间的重复代码,不可取. 在这篇博文中改用middleware实现,并且放在独 ...

  3. 从零搭建一个IdentityServer——聊聊Asp.net core中的身份验证与授权

    OpenIDConnect是一个身份验证服务,而Oauth2.0是一个授权框架,在前面几篇文章里通过IdentityServer4实现了基于Oauth2.0的客户端证书(Client_Credenti ...

  4. ASP.NET Core中显示自定义错误页面

    在 ASP.NET Core 中,默认情况下当发生500或404错误时,只返回http状态码,不返回任何内容,页面一片空白. 如果在 Startup.cs 的 Configure() 中加上 app. ...

  5. ASP.NET Core中使用自定义MVC过滤器属性的依赖注入

    除了将自己的中间件添加到ASP.NET MVC Core应用程序管道之外,您还可以使用自定义MVC过滤器属性来控制响应,并有选择地将它们应用于整个控制器或控制器操作. ASP.NET Core中常用的 ...

  6. ASP.NET Core中使用自定义路由

    上一篇文章<ASP.NET Core中使用默认MVC路由>提到了如何使用默认的MVC路由配置,通过这个配置,我们就可以把请求路由到Controller和Action,通常情况下我们使用默认 ...

  7. 在ASP.NET Core中创建自定义端点可视化图

    在上篇文章中,我为构建自定义端点可视化图奠定了基础,正如我在第一篇文章中展示的那样.该图显示了端点路由的不同部分:文字值,参数,动词约束和产生结果的端点: 在本文中,我将展示如何通过创建一个自定义的D ...

  8. asp.net core中写入自定义中间件

    首先要明确什么是中间件?微软官方解释:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?tabs=aspnet ...

  9. asp.net mvc 中的自定义验证(Custom Validation Attribute)

    前言

随机推荐

  1. Duplicate复制数据库并创建物理StandBy(spfile+不同实例名+不同路径)

    过程和Duplicate复制数据库并创建物理StandBy类似,只是不需要重启数据库. 目的:创建standby,不重启源数据库 1设定环境如下: Primary数据库 IP 172.17.22.16 ...

  2. 利用ConcurrentHashMap来实现一个ConcurrentHashSet

    利用ConcurrentHashMap来实现一个ConcurrentHashSet package hashset; import java.io.Serializable; import java. ...

  3. 基于Ubuntu 搭建 VNC 远程桌面服务

    系统要求:Ubuntu 16.04.1 LTS 64 位操作系统 安装.启动 VNC VNC 远程桌面原理 注:本小节内容旨在帮助您更好地了解 Xorg.X11.VNC 等概念和原理,如果你不想了解原 ...

  4. C++11中的右值引用及move语义编程

    C++0x中加入了右值引用,和move函数.右值引用出现之前我们只能用const引用来关联临时对象(右值)(造孽的VS可以用非const引用关联临时对象,请忽略VS),所以我们不能修临时对象的内容,右 ...

  5. jQuery的deferred对象详解(转)

    jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. ...

  6. Easyui的DataGrid 清除所有勾选的行。

    $('#grid').datagrid('clearChecked')='none';//清除所有勾选的行.

  7. Django TemplateDoesNotExist

    在联系Django的时候,启动正常,我在浏览器上输入URL地址后报错 TemplateDoesNotExist at /test/ 解决方案 默认这里是空的,这里我们填上我们静态文件的地址

  8. linux每日命令(28):chgrp命令

    在linux系统里,文件或目录的权限的掌控以拥有者及所属群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...

  9. 【Java】加载驱动方法

    1.Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 2. DriverManager.register ...

  10. 【GMT43智能液晶模块】例程九:RTC实验——时钟显示

    实验原理: STM32的实时时钟(RTC)是一个独立的定时器,有一组连续计数的 计数器,通过软件来对其进行相关的配置,可以提供时钟功能,通过修改计 数器的的值,可以调整时钟.最终通过emWin在显示屏 ...