ASP.NET WebAPI如何接收查询参数中的%20(空格)而非Null
解决ASP.NET WebAPI接收%20为空格而非null的问题
这问题我之前做项目时也踩过坑——ASP.NET WebAPI默认的模型绑定逻辑会把空白字符串(包括单个空格)自动转换为null,这就是你调用GetFoo?something=%20时参数变成null的原因。下面给你几种可行的解决方案,按需选择:
方案一:全局配置(所有字符串参数生效)
如果希望整个项目里的字符串参数都保留空白值,不转成null,可以自定义一个字符串专属的模型绑定器,然后全局注册:
- 先创建自定义模型绑定器类:
public class NonNullStringModelBinder : IModelBinder { public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) { // 只处理string类型的参数 if (bindingContext.ModelType != typeof(string)) return false; // 获取请求中的参数值 var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); if (valueProviderResult == null) return false; // 直接赋值,不管是不是空白,都不转null bindingContext.Model = valueProviderResult.AttemptedValue; return true; } }
- 在
WebApiConfig.cs的Register方法里注册这个绑定器:
public static void Register(HttpConfiguration config) { // 其他配置代码... // 给所有string类型参数绑定自定义绑定器 config.BindParameter(typeof(string), new NonNullStringModelBinder()); }
方案二:单个参数生效(更灵活)
如果只需要让GetFoo方法的something参数生效,不用全局修改,可以直接在参数上标注特性:
public async Task<HttpResponseMessage> GetFoo( [ModelBinder(typeof(NonNullStringModelBinder))] string something = null) { // 你的业务逻辑... }
方案三:修改默认绑定器的全局设置(慎用)
还有一种方式是直接修改默认DefaultModelBinder的ConvertEmptyStringToNull属性,但这个设置会影响所有类型的绑定,可能带来意想不到的副作用,所以只推荐在你明确知道影响范围的情况下使用:
public static void Register(HttpConfiguration config) { // 其他配置代码... var defaultBinder = new DefaultModelBinder(); defaultBinder.ConvertEmptyStringToNull = false; config.Services.Replace(typeof(IModelBinderProvider), new DefaultModelBinderProvider { Binder = defaultBinder }); }
配置完成后,再调用GetFoo?something=%20,something参数就会正确接收到单个空格字符串,而不是null了。
内容的提问来源于stack exchange,提问作者peter-bergman
相关产品推荐
相关产品推荐

