【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 中全局异常处理,有时候可能不能满足我们的需要,可能就需要自己自定义一个中间件处理了,最近遇到一个问题,有一些异 ...
随机推荐
- vue3 vue-i18n 入口文件配置报警
报警: You are running the esm-bundler build of vue-i18n. It is recommended to conf 解决: 在vue.config.js文 ...
- Windows10电源选项:睡眠、休眠、启用快速启动
参考链接: http://www.dnpz.net/diannaozhishi/2223.html http://www.cfan.com.cn/2018/0118/130151.shtml 在介绍w ...
- “你帮我助”软件开发(Final)
本项目是上海交通大学 CS-3331 软件工程课程大作业. 作业描述 "你帮我助"软件开发(Final) 新的功能需求: 物品有公共的信息(物品名称,物品说明,物品所在地址,联系人 ...
- rename基本操作
电脑是Macbook, 用Homebrew先安装rename. 如果没安装Homebrew 直接复制到terminal中回车, 时间稍长. ruby -e "$(curl -fsSL htt ...
- Docker安装:Centos7.6安装Docker
Docker03:Centos7.6安装Docker 前提条件 内核版本 更新yum 包 卸载旧版本(如果安装过旧版本的话) 安装依赖包 设置yum源(阿里云源) 更新缓存 安装容器 启动并加入开机启 ...
- leetcode medium 记录 51-100
# Title Solution Acceptance Difficulty Frequency 92 Reverse Linked List II 40.3% Medium ...
- 这篇文章汇聚33个BUG!来挑战一下,看看你能找出来几个?
你好呀,我是歪歪. 前几天看到"Qunar技术沙龙"公众号推送了一篇关于他们举办了一场"Code Review大赛"的文章. 看到 Code Review 我很 ...
- 关于Android开发工具的下载之ADT篇
ADT的下载 首先可以选择下面推荐的两个网站去下载相应的安装包,网址如下: http://tools.android-studio.org/index.php/adt-bundle-plugin 或者 ...
- 22.this指针
1.this指针工作原理 我们知道,c++的数据和操作也是分开存储,并且每一个非内联成员函数(non-inline member function)只会诞生一份函数实例,也就是说多个同类型的对象会共用 ...
- IconJar - Mac 上的一款多功能图标素材管理工具
IconJar 是一个多功能的图标管理工具,由世界各地的设计师和开发人员使用.在一个应用程序中搜索.组织.预览和检索图标,而不是创建大量的文件夹来存储你的收藏.这款应用针对黑暗模式进行了优化,并支持S ...