如何从TypeScript向C# Web API传递空字符串而非Null
我之前也碰到过一模一样的问题!本质上是ASP.NET Web API默认的模型绑定/序列化行为在搞鬼——它会把接收到的空字符串(或者未明确传值的字段)自动转换成null,而不是保留空字符串。下面给你几个最实用的解决办法:
1. 封装请求模型并设置默认空字符串(最推荐)
把API的参数封装成一个C#模型类,给每个字符串属性设置默认值为空字符串。这样即使Web API把空值解析成null,属性的默认值会兜底成空字符串:
// C# 端的请求模型 public class ChangePasswordRequest { // 给每个字符串属性设置默认空字符串 public string Username { get; set; } = string.Empty; public string OldPassword { get; set; } = string.Empty; public string NewPassword { get; set; } = string.Empty; } // 修改API方法,用[FromBody]接收模型 [HttpPost("change-password")] public IActionResult ChangePassword([FromBody] ChangePasswordRequest request) { // 这里request.OldPassword和NewPassword就会是空字符串,而不是null return Ok(); }
客户端你的TypeScript代码不用改太多,只要确保发送的JSON体里包含对应的字段(哪怕是空字符串),比如:
// 客户端请求示例(假设用fetch) fetch('/api/change-password', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: username, oldPassword: oldPwd, newPassword: newPwd }) });
2. 自定义Json转换器强制将Null转为空字符串
如果不想改模型,也可以全局配置一个Json转换器,让所有字符串类型在反序列化时自动把null转换成空字符串:
// 自定义字符串转换器 public class EmptyStringConverter : JsonConverter<string> { public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 读取值,为null则返回空字符串 string? value = reader.GetString(); return value ?? string.Empty; } public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) { writer.WriteStringValue(value); } } // 在Startup.cs/Program.cs里注册这个转换器(.NET 6+示例) builder.Services.AddControllers() .AddJsonOptions(options => { // 添加自定义转换器 options.JsonSerializerOptions.Converters.Add(new EmptyStringConverter()); // 其他配置... options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; });
这样所有API接收的字符串参数,只要客户端传了空字符串(或者序列化后是空字符串),服务器端都会收到空字符串而不是null。
3. 用DisplayFormat属性禁用空字符串转Null(适合单个参数场景)
如果你的API是直接用单个字符串参数而不是模型,可以给参数加上[DisplayFormat(ConvertEmptyStringToNull = false)]属性,告诉模型绑定器不要把空字符串转成null:
[HttpPost("change-password")] public IActionResult ChangePassword( string username, [DisplayFormat(ConvertEmptyStringToNull = false)] string oldPassword, [DisplayFormat(ConvertEmptyStringToNull = false)] string newPassword) { // 这里oldPassword和newPassword会保留空字符串 return Ok(); }
注意:这个方法更适合表单提交(application/x-www-form-urlencoded)的场景,如果是JSON请求,还是前面两种方法更可靠。
最后提醒一下:客户端一定要确保请求的Content-Type是application/json,并且序列化的时候没有把空字符串过滤掉(比如不要用会自动移除空值的序列化配置)。你的TypeScript代码里已经把null/undefined转成空字符串了,这部分是没问题的。
内容的提问来源于stack exchange,提问作者Nomesh Gajare

