陕西网站建设教程,济南网站建设sdjy6,自助网站免费注册,dw怎么做别人可以看的网站一.前言通过各种姿势搜索都没搜到这方面的,唯一找到一个比较符合的,但是只适合简单类型,而且代码还没贴全,心累。。然后查看官网和源码之后,发现继承并实现 IModelBinder和IModelBinderProvider 即可。我这里是WebApi,所以要区分绑定属性[FromBody]、[FromForm]等。不同的绑定方…一.前言通过各种姿势搜索都没搜到这方面的,唯一找到一个比较符合的,但是只适合简单类型,而且代码还没贴全,心累。。然后查看官网和源码之后,发现继承并实现 IModelBinder和IModelBinderProvider 即可。我这里是WebApi,所以要区分绑定属性[FromBody]、[FromForm]等。不同的绑定方法要实现不同的IModelBinder。二:正文api主要设计到的就是[FromBody]和[FromQuery],我这里也只实现了这两种,其余的方式没测试过。public class StringTrimModelBinderProvider : IModelBinderProvider{private readonly IList _formatters;public StringTrimModelBinderProvider(IList formatters){_formatters formatters;}public IModelBinder GetBinder(ModelBinderProviderContext context){if (context null)throw new ArgumentNullException(nameof(context));if (!context.Metadata.IsComplexType context.Metadata.ModelType typeof(string)){//简单类型var loggerFactory (ILoggerFactory)context.Services.GetService(typeof(ILoggerFactory));return new SimpleStringTrimModelBinder(context.Metadata.ModelType);}else if (context.BindingInfo.BindingSource ! null context.BindingInfo.BindingSource.CanAcceptDataFrom(BindingSource.Body)){//通过[FromBody]绑定的return new BodyStringTrimModelBinder(_formatters, context.Services.GetRequiredService());}//else//if (context.Metadata.IsComplexType !context.Metadata.IsCollectionType)//{// //复杂类型// var propertyBinders context.Metadata.Properties// .ToDictionary(modelProperty modelProperty, modelProperty context.CreateBinder(modelProperty));// var loggerFactory (ILoggerFactory)context.Services.GetService(typeof(ILoggerFactory));// return new AComplexTypeModelBinder(propertyBinders);//}return null;}}下面的是实现IModelBinderpublic class SimpleStringTrimModelBinder : IModelBinder{private readonly Type _type;public SimpleStringTrimModelBinder(Type type){_type type;}public Task BindModelAsync(ModelBindingContext bindingContext){if (bindingContext null){throw new ArgumentNullException(nameof(bindingContext));}var valueProvider bindingContext.ValueProvider;var modelName bindingContext.ModelName;var valueProviderResult valueProvider.GetValue(modelName);if (valueProviderResult ValueProviderResult.None){return Task.CompletedTask;}string value valueProviderResult.FirstValue.Trim();//bindingContext.ModelState.SetModelValue(modelName, new ValueProviderResult(value));//替换原有ValueProviderbindingContext.ValueProvider new CompositeValueProvider{new ElementalValueProvider(modelName, value, valueProviderResult.Culture),bindingContext.ValueProvider};//调用默认系统绑定SimpleTypeModelBinder simpleTypeModelBinder new SimpleTypeModelBinder(_type, (ILoggerFactory)bindingContext.HttpContext.RequestServices.GetService(typeof(ILoggerFactory)));simpleTypeModelBinder.BindModelAsync(bindingContext);//bindingContext.Result ModelBindingResult.Success(value);return Task.CompletedTask;}}public class BodyStringTrimModelBinder : IModelBinder{private readonly BodyModelBinder bodyModelBinder;public BodyStringTrimModelBinder(IList formatters, IHttpRequestStreamReaderFactory readerFactory){bodyModelBinder new BodyModelBinder(formatters,readerFactory);}public Task BindModelAsync(ModelBindingContext bindingContext){if (bindingContext null){throw new ArgumentNullException(nameof(bindingContext));}//调用原始body绑定数据bodyModelBinder.BindModelAsync(bindingContext);//判断是否设置了值if (!bindingContext.Result.IsModelSet){return Task.CompletedTask;}//获取绑定对象var model bindingContext.Result.Model;/*通过反射修改值,也可以实现 IInputFormatter接口里面的ReadAsync方法,自己从Request.Body里面获取数据进行处理,但是那样考虑的比较多也比较复杂,原谅我能力有限。。*/var stringPropertyInfo model.GetType().GetProperties().Where(cc.PropertyType typeof(string));foreach (PropertyInfo property in stringPropertyInfo){string value property.GetValue(model)?.ToString()?.Trim();property.SetValue(model, value);}//bindingContext.Result ModelBindingResult.Success(value);return Task.CompletedTask;}}最后,需要将我们自定义的在Startup注册进去,services.AddMvc(options {//需要插入到第一条,内置默认是匹配到合适的Provider就不会在向下继续绑定;如果添加到末尾,即不会调用到我们实现的options.ModelBinderProviders.Insert(,new StringTrimModelBinderProvider(options.InputFormatters));})记录成长中的点点滴滴。。ASPperiod;NET Core WebApi 返回统一格式参数(Json 中 Null 替换为空字符串)相关博文:ASP.NET Core WebApi 返回统一格式参数 业务场景: 统一返回格式参数中,如果包含 Null 值,调用方会不太好处理,需要替换为空字符串,示例: { respon ...解决period;NET Core Ajax请求后台传送参数过大请求失败问题解决.NET Core Ajax请求后台传送参数过大请求失败问题 今天在项目上遇到一个坑, 在.Net Core中通过ajax向mvc的controller传递对象时,控制器(controller)的 ...Cplus;plus;去掉字符串中首尾空格和所有空格c去掉首尾空格是参考一篇文章的,但是忘记文章出处了,就略过吧. 去掉首尾空格的代码如下: void trim(string s) { if( !s.empty() ) { s.erase ...php中利用正则去掉中文全角空格一开始用$temp trim($temp, ); 这种方法,导致trim后的中文字符有乱码 最后 $str 广东君孺律师事务所 ; $str ...Cnum; 调用命令行comma;参数有空格在程序中调用cmd命令打开一个文件,而文件路径带有空格,如果直接把路径传给cmd,那么cmd就会把路径空格前面的部分当做是一个参数,空格后当做另一个参数,命令行执行把后边截掉了,导致程序出错,会弹出了 ...关于一些url中传递参数有空格问题1.关于一些url中传递参数有空格问题: url.replace(/ /g, %20) 从上面的例子中可以看到可以用:replace(/ /g, %20 ...as3中去掉字符串两边的空格换行符as3 去掉字符串两边的空格,换行符,方法一 ActionScript Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 pub ...ios 去掉字符串中的空格 和指定的字符[问题分析] .使用NSString中的stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]方法只是去掉左右 ...【代码笔记】iOS-请求去掉url中的空格一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...随机推荐Cnum;程序using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...POJ 3041 匈牙利算法模板题一开始预习是百度的算法 然后学习了一下 然后找到了学长的ppt 又学习了一下.. 发现..居然不一样... 找了模板题试了试..百度的不好用 反正就是wa了..果然还是应当跟着学长混.. 图两边的点分 ...URL重写以后发布到IIS找不到页面1.读取必须勾选,否则无法加载资源文件(img,css等) c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dlllbrack; Java面试题 rsqb;算法篇1.堆和栈在内存中的区别是什么? 概念: 栈(stack)是为执行线程留出的内存空间.当函数被调用的时候,栈顶为局部变量和一些 bookkeeping 数据预留块.当函数执行完毕,块就没有用了,可能在 ...Docker镜像存储-overlayfs一.概述 Docker中的镜像采用分层构建设计,每个层可以称之为“layer”,这些layer被存放在了/var/lib/docker//目录下,这里的st ...HTTP max-age与Expires的分别主要重点在于我们要明白一个相对(Expires)一个绝对(max-age). 分别 max-agemax-age是HTTP/1.1中,他是指我们的web中的文件被用户访问(请求)后的存活时间,是个相对 ...CSS常用1.CSS3新增特性,目前主流浏览器都支持 -webkit-user-select: none; /* Chrome all / Safari all /opera15*/ -moz-user- ...Unity3D使用EasyMovieTexture插件播放视频Unity3D对于视频的播放兼容个人感觉很差劲,之前写过一篇使用Unity3D自己自带的一些功能去播放视频,链接如下: http://www.cnblogs.com/xiaoyulong/p/8627 ...hdu 6125 状压dpplus;分组一道玄学题... 其实一开始想的是对的,优化一下就好了 首先我们会发现,乘积不能被完全平方数整除等价于所有因子的每个质因子个数和都至多为1 可是500以内的质数很多,全找出来会爆炸的 可我们会发现,如 ...两种简单实现菜单高亮显示的JS类lpar;转载rpar;两种简单实现菜单高亮显示的JS类 近期在写一个博客管理后台的前端,涉及在同一页面两种高亮显示当前菜单的需求.记得当年写静态页时,为了实现高亮都是在每个页面加不同的样式,呵.高亮显示我觉得对于web ...