You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从TypeScript向C# Web API传递空字符串而非Null

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:11:44