前言
有網友在交流群中詢問,如何讓 ASP.NET Core 支持綁定查詢字符串中的數組:
據說,在 .NET 7 中已經支持了:
但是,在這之前的 .NET 版本能實現相同功能嗎?
ByteArrayModelBinder
這時,群里的網友提供了一個思路,使用 base64 編碼:
查看官方文檔,確實可以實現:
缺點是只支持byte[]
,不能使用int[]
:
[HttpGet]
public?string?Get([FromQuery]byte[]?values)
{return?string.Join("?",?values.Select(p?=>?p.ToString()));
}
但是,我們可以借鑒ByteArrayModelBinder
的實現思路,實現我們自己的IntArrayModelBinder
。
IntArrayModelBinder
查看ByteArrayModelBinder
的源碼,關鍵代碼如下:
public?class?ByteArrayModelBinder?:?IModelBinder
{public?Task?BindModelAsync(ModelBindingContext?bindingContext){//獲取傳入的值var?valueProviderResult?=?bindingContext.ValueProvider.GetValue(bindingContext.ModelName);var?value?=?valueProviderResult.FirstValue;//Base64?轉?byte[]var?model?=?Convert.FromBase64String(value);//綁定到參數bindingContext.Result?=?ModelBindingResult.Success(model);return?Task.CompletedTask;}
}
我們依葫蘆畫瓢,實現IntArrayModelBinder
:
public?class?IntArrayModelBinder?:?IModelBinder
{public?Task?BindModelAsync(ModelBindingContext?bindingContext){//獲取傳入的值var?valueProviderResult?=?bindingContext.ValueProvider.GetValue(bindingContext.ModelName);var?value?=?valueProviderResult.FirstValue;//string?轉?int[]var?model?=?value.Trim('[',']').Split(',').Select(str=>int.Parse(str)).ToArray();?//綁定到參數bindingContext.Result?=?ModelBindingResult.Success(model);return?Task.CompletedTask;}
}
測試一下使用IntArrayModelBinder
,執行成功:
[HttpGet]
public?string?Get([FromQuery][ModelBinder(BinderType?=?typeof(IntArrayModelBinder))]?int[]?values)
{return?string.Join("?",?values.Select(p?=>?p.ToString()));
}
結論
可能你已經注意到,在使用byte[]
時,我們并沒有顯示指定ModelBinder
。那ASP.NET Core 是如何實現自動使用ByteArrayModelBinder
的呢?我們下回分解。
添加微信號【MyIO666】,邀你加入技術交流群