ajax modelbinder,.NET Core 使用ModelBinder去掉所有参数的空格
一.前言
通過各種姿勢搜索都沒搜到這方面的,唯一找到一個比較符合的,但是只適合簡單類型,而且代碼還沒貼全,心累。。
然后查看官網和源碼之后,發現繼承并實現 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;
}
}
下面的是實現IModelBinder
public 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));
//替換原有ValueProvider
bindingContext.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(c=>c.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));
})
記錄成長中的點點滴滴。。
ASP.NET Core WebApi 返回統一格式參數(Json 中 Null 替換為空字符串)
相關博文:ASP.NET Core WebApi 返回統一格式參數 業務場景: 統一返回格式參數中,如果包含 Null 值,調用方會不太好處理,需要替換為空字符串,示例: { "respon ...
解決.NET Core Ajax請求后臺傳送參數過大請求失敗問題
解決.NET Core Ajax請求后臺傳送參數過大請求失敗問題 今天在項目上遇到一個坑, 在.Net Core中通過ajax向mvc的controller傳遞對象時,控制器(controller)的 ...
C++去掉字符串中首尾空格和所有空格
c++去掉首尾空格是參考一篇文章的,但是忘記文章出處了,就略過吧. 去掉首尾空格的代碼如下: void trim(string &s) { if( !s.empty() ) { s.erase ...
php中利用正則去掉中文全角空格
一開始用$temp = trim($temp, " "); 這種方法,導致trim后的中文字符有亂碼 最后 $str = " 廣東君孺律師事務所 "; $str ...
C# 調用命令行,參數有空格
在程序中調用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, ...
隨機推薦
C#程序
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.dll
[ Java面試題 ]算法篇
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 狀壓dp+分組
一道玄學題... 其實一開始想的是對的,優化一下就好了 首先我們會發現,乘積不能被完全平方數整除等價于所有因子的每個質因子個數和都至多為1 可是500以內的質數很多,全找出來會爆炸的 可我們會發現,如 ...
兩種簡單實現菜單高亮顯示的JS類(轉載)
兩種簡單實現菜單高亮顯示的JS類 ? 近期在寫一個博客管理后臺的前端,涉及在同一頁面兩種高亮顯示當前菜單的需求.記得當年寫靜態頁時,為了實現高亮都是在每個頁面加不同的樣式,呵.高亮顯示我覺得對于web ...
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的ajax modelbinder,.NET Core 使用ModelBinder去掉所有参数的空格的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c# 两个数的加减乘除
- 下一篇: idea和搜狗输入法快捷键冲突_ubun