【asp.net core】自定义模型绑定及其验证
引言
水此篇博客,依旧是来自群里的讨论,最后说到了,在方法参数自定义了一个特性,用来绑定模型,优先从Form取,如果为空,或者不存在,在从QueryString中获取并且绑定,然后闲着无聊,就水一篇博客,如果大家有什么需求或者问题,可以找我,很高兴能为你们带来帮助。
IModelBinderFactory
总共也没有多少代码,关键其实也就是在于三个接口而已。第一个接口就是模型绑定工厂接口,继承这个接口,然后实现创建IModelBinder接口的实例即可,当然可以看到我们需要实现IModelBinder接口,在这个接口中,我们就new一个TestBinder就行了,只实现效果,不涉及业务,然后在绑定的时候会调用到BindModelAsync方法,然后在此处你可以实现自定义模型绑定,可以结合Required或者Email,MaxLength特性,结合HttpCotnext实现自己的一个模型绑定。
public class TestBinderFactory : IModelBinderFactory
{ public IModelBinder CreateBinder(ModelBinderFactoryContext context)
{
return new TestBinder();
}
}
public class TestBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
bindingContext.Model = new TestModel() { };
bindingContext.Result = ModelBindingResult.Success(bindingContext.Model);
return Task.CompletedTask;
}
}
IObjectModelValidator
在模型绑定之后,还需要实现自定义的一个验证,在默认情况下,如果使用自己去验证,且你绑定好的模型里有属性为null,则会提示the propertyname is required,就是这个属性是必须的,就需要在此处实现一个自定义验证,让通过验证,如果有需要你还需要实现IValidationStrategy接口,用来对模型内部的各个子项属性进行验证,当然如果不需要验证的话可以直接走默认的,即实现了这个接口,但不写Validate的方法体,空方法就行,如果需要就自己实现就行了,同时将自己实现的接口注入到容器,替换掉自带的就可以实现自定义模型绑定和验证了。
public class Validator : IObjectModelValidator
{
public Validator(IModelMetadataProvider modelMetadataProvider)
{
ModelMetadataProvider = modelMetadataProvider;
} public IModelMetadataProvider ModelMetadataProvider { get; } public void Validate(ActionContext actionContext, ValidationStateDictionary? validationState, string prefix, object? model)
{
//var data=ModelMetadataProvider.GetMetadataForType(model.GetType());
//var entry=new Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationStateEntry();
//entry.Key = "Name";
//entry.Metadata = data;
//validationState.Add("Name", entry);
}
}
builder.Services.AddSingleton<IObjectModelValidator, Validator>();
builder.Services.AddSingleton<IModelBinderFactory, TestBinderFactory>();
结尾
本博客仅提供思路以及部分接口实现,不涉及任何业务,如果在asp.net core中需要自定义实现什么,此处提供几个思路,
1:去api浏览器,找到对应的相关接口,传送门。
2:然后在启动的时候,在service全部注入之后,打断点,找到和你要实现自定义相关的接口或者实例即可。
3:根据第二步找到的相关注入类型,在api浏览器找到对应的,实现这个接口然后注入进去即可,源码中所有的都是tryadd,所以不用担心冲突,存在多种实现的也都是集合类型的。
4:接下来就是调试运行,就行了。
当然有能力者,可以直接去阅读源码实现即可,思路往往比具体的实现更重要。近期会在此处讲解asp.net core启动流程及其源码,有兴趣的话,可以进群。
【asp.net core】自定义模型绑定及其验证的更多相关文章
- asp.net MVC 自定义模型绑定 从客户端中检测到有潜在危险的 Request.QueryString 值
asp.net mvc 自定义模型绑定 有潜在的Requset.Form 自定义了一个模型绑定器.前端会传过来一些敏感字符.调用bindContext. valueProvider.GetValue( ...
- asp.net mvc 自定义模型绑定
在asp.net mvc的控制器中如果能够活用模型的自动绑定功能的话能够减少许多工作量.但是如果我们想要对前台传来的数据进行一些处理再绑定到模型上,该怎么做呢? 这里用一个绑定用户数据的小案例来讲解a ...
- ASP.NET Core MVC 模型绑定用法及原理
前言 查询了一下关于 MVC 中的模型绑定,大部分都是关于如何使用的,以及模型绑定过程中的一些用法和概念,很少有关于模型绑定的内部机制实现的文章,本文就来讲解一下在 ASP.NET Core MVC ...
- ASP.NET Core MVC 模型绑定 (转载)
ASP.NET Core MVC的Model Binding会将HTTP Request数据,以映射的方式对应到参数中.基本上跟ASP.NET MVC差不多,但能Binding的来源更多了一些.本篇将 ...
- asp.net core自定义模型验证——前端验证
转载请注明出处:http://www.cnblogs.com/zhiyong-ITNote/ 官方网站:https://docs.microsoft.com/zh-cn/aspnet/core/mvc ...
- ASP.NET MVC 自定义模型绑定1 - 自动把以英文逗号分隔的 ID 字符串绑定成 List<int>
直接贴代码了: CommaSeparatedModelBinder.cs using System; using System.Collections; using System.Collection ...
- asp.net core系列 45 Web应用 模型绑定和验证
一. 模型绑定 ASP.NET Core MVC 中的模型绑定,是将 HTTP 请求中的数据映射到action方法参数. 这些参数可能是简单类型的参数,如字符串.整数或浮点数,也可能是复杂类型的参数. ...
- asp.net core 自定义认证方式--请求头认证
asp.net core 自定义认证方式--请求头认证 Intro 最近开始真正的实践了一些网关的东西,最近写几篇文章分享一下我的实践以及遇到的问题. 本文主要介绍网关后面的服务如何进行认证. 解决思 ...
- .net core mvc 模型绑定 之 json and urlencoded
.net core mvc 模型绑定, FromQuery,对应 url 中的 urlencoded string ("?key1=value1&key2=value2") ...
- asp.net core 自定义异常处理中间件
asp.net core 自定义异常处理中间件 Intro 在 asp.net core 中全局异常处理,有时候可能不能满足我们的需要,可能就需要自己自定义一个中间件处理了,最近遇到一个问题,有一些异 ...
随机推荐
- python&C++区别
1.类的定义 struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), ne ...
- 引用本地的layUI
<script src="/public/vendor/layui-v2.5.6/layui.all.js"></script>
- 3---java中的集合
集合是什么:表示一组元素的对象,有的是有序的,有的是无序的,有的是可重复的,有的是不可重复的. 首先根是:Collection 1:Set 没有重复元素 SortedSet 有序的Set 2:Lis ...
- IBM 双队列管理器,双向传输
1. 建立队列管理器 建立[test01][test02]两个队列管理器,一直下一步即可,端口号不能一致(需要记住设置的端口号,后面会用到) [test01]端口号 1414 [test02]端口号 ...
- sql处理重复的列,更好理清分组和分区
一.分组统计.分区排名 1.语法和含义: 如果查询结果看得有疑惑,看第二部分-sql处理重复的列,更好理清分组和分区,有建表插入数据的sql语句 分组统计:GROUP BY 结合 统计/聚合函数一起使 ...
- Spring--案例:数据源对象管理
案例:数据源对象管理 对于已经学过数据库的我来说,这看起来就像是连接数据库的操作: 就像javaweb项目里面的db.properties文件的使用一样,我们需要先导入一个包,(我用的是Maven项目 ...
- 使用containerd搭建MinIO集群服务
概述 因为在云服务器上默认只有一块磁盘,如果直接在系统盘上安装MinIO,会被拒绝,所以这里采用containerd的方式绕过这一限制 操作环境 操作系统 CentOS 7.9 MinIO版本 REL ...
- cost function 成本函数
cost function 成本函数 cost function-成本函数 1.目标 :实现和探索具有一个变量的线性回归的成本函数. import numpy as np %matplotlib wi ...
- Navicate 远程连接Mysql数据库
123步骤是在服务器上运行,第四步是在本机的navicate上运行 1.use mysql 2.update user set host = '%' where user = 'root' 3.flu ...
- Windows10一劳永逸的禁止更新/恢复更新
之前发表过一篇文章Windows10彻底关闭自动更新,这篇文章相对复杂了些.而且还是有一定几率会触发从而自动打开更新.下面讲的就是怎么一次性永久关闭更新,即使触发了更新,也不能下载更新,从而达到真正的 ...