.NET Core基础表单提交空字符串转为null的问题及解决方法
.NET Core MVC 提交空/空格字符串时接收为null的解决办法
在基础.NET Core MVC项目里(未配置额外模型规则),提交空文本框或仅输入空格时,控制器的string参数会被绑定为null,而非预期的空字符串。以下是问题代码及解决办法:
原问题代码
路由配置(Program.cs)
app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
视图表单
<form method="POST" action="/Home/ProcessForm"> <div class="header">MetaIGPageIDDD</div> <input type="text" name="input" /> <input type="submit" /> </form>
控制器方法
[HttpPost] public IActionResult ProcessForm(string input) { string ret = "input: |" + input + "| len:" + input.Length; throw new Exception(ret); }
解决办法
方法一:直接从Request.Form获取值(快速局部解决)
跳过默认模型绑定,直接从表单集合读取原始值,无论输入是空还是空格,都能得到对应的字符串:
[HttpPost] public IActionResult ProcessForm() { string input = Request.Form["input"].ToString(); string ret = "input: |" + input + "| len:" + input.Length; throw new Exception(ret); }
方法二:全局修改模型绑定行为(全项目生效)
如果需要整个项目都保留空/空格字符串,不转为null,可以自定义字符串模型绑定器:
- 实现自定义模型绑定器及提供者:
public class CustomStringModelBinderProvider : IModelBinderProvider { public IModelBinder GetBinder(ModelBinderProviderContext context) { if (context.Metadata.ModelType == typeof(string)) { return new CustomStringModelBinder(); } return null; } } public class CustomStringModelBinder : IModelBinder { public Task BindModelAsync(ModelBindingContext bindingContext) { if (bindingContext == null) throw new ArgumentNullException(nameof(bindingContext)); var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); if (valueProviderResult == ValueProviderResult.None) return Task.CompletedTask; bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult); // 直接返回原始表单值,不将空/空格转为null var value = valueProviderResult.FirstValue; bindingContext.Result = ModelBindingResult.Success(value); return Task.CompletedTask; } }
- 在Program.cs中注册自定义绑定器:
builder.Services.AddControllersWithViews(options => { // 替换默认的字符串模型绑定器提供者 var defaultStringProvider = options.ModelBinderProviders.FirstOrDefault(p => p is StringModelBinderProvider); if (defaultStringProvider != null) { options.ModelBinderProviders.Remove(defaultStringProvider); options.ModelBinderProviders.Insert(0, new CustomStringModelBinderProvider()); } });
配置完成后,所有string类型的参数都会保留原始的空/空格字符串,不再被转为null。
内容的提问来源于stack exchange,提问作者Anders Den
相关产品推荐
相关产品推荐

