gpt4 book ai didi

json.net - ASP.NET Core MVC - 将 JSON 发送到服务器时为空字符串

转载 作者:行者123 更新时间:2023-12-04 00:30:51 24 4
gpt4 key购买 nike

将输入数据作为 FormData 发布到 ASP.NET Core MVC Controller 时,默认情况下,空字符串值被强制转换为 null 值。

但是,当将输入数据作为 JSON 发送到 Controller 时,空字符串值将保持原样。这会在验证 string 属性时导致不同的行为。例如,description字段不绑定(bind)null,而是绑定(bind)服务器上的空字符串:

{
value: 1,
description: ""
}

这反过来又使以下模型无效,即使 Description 不是必需的:

public class Item
{
public int Value { get; set; }

[StringLength(50, MinimumLength = 3)]
public string Description { get; set; }
}

这与通过表单提交相同数据时的行为相反。

有没有办法让 JSON 的模型绑定(bind)的行为与表单数据的模型绑定(bind)相同(空字符串默认强制为 null)?

最佳答案

查看ASP.NET Core MVC (v2.1)的源代码后和 Newtonsoft.Json (v11.0.2) 的源代码,我想出了以下解决方案。

首先,创建自定义JsonConverter:

public class EmptyStringToNullJsonConverter : JsonConverter
{
public override bool CanRead => true;
public override bool CanWrite => false;

public override bool CanConvert(Type objectType)
{
return typeof(string) == objectType;
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
string value = (string)reader.Value;
return string.IsNullOrWhiteSpace(value) ? null : value.Trim();
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException("Unnecessary because CanWrite is false. The type will skip the converter.");
}
}

然后,全局注册自定义转换器:

services
.AddMvc(.....)
.AddJsonOptions(options => options.SerializerSettings.Converters.Add(new EmptyStringToNullJsonConverter()))

或者,通过 JsonConverterAttribute 在每个属性基础上使用它。例如:

public class Item
{
public int Value { get; set; }

[StringLength(50, MinimumLength = 3)]
[JsonConverter(typeof(EmptyStringToNullJsonConverter))]
public string Description { get; set; }
}

关于json.net - ASP.NET Core MVC - 将 JSON 发送到服务器时为空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51376618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com