gpt4 book ai didi

asp.net-web-api - 枚举值不解析时如何将枚举作为字符串绑定(bind)失败处理

转载 作者:行者123 更新时间:2023-12-04 11:47:20 25 4
gpt4 key购买 nike

在我们的 ASP.net Core Web API 应用程序中,当我的 Controller 方法接受具有 ENUM 属性的复杂对象时,当 ENUM 被反序列化为字符串时,我正在寻找一种方法来捕获绑定(bind)错误。
例如。

class Person
{
public string Name {get; set;}
public SexEnum Sex {get; set;}
}

enum SexEnum
{
Male,
Female,
Other
}
我们在系统范围内使用 StringEnumConverter所以 Person 的 JSON 序列化实例看起来像这样:
{
"name": "Ann",
"sex": "female"
}
现在,如果我发布这个 JSON(注意 sex 属性中的错字):
{
"name": "Ann",
"sex": "femal"
}
由于绑定(bind)失败, Controller 方法接收到的整个对象为 NULL。
我想捕捉那个绑定(bind)错误,而不是让管道进入 Controller ,就好像没有任何问题一样,而是向客户端返回一个 BAD REQUEST,包括哪个属性值无法绑定(bind)的详细信息。
我知道我要反序列化的类型,我知道我要反序列化的属性类型,并且我可以看到该值没有解析为类型。所以我认为必须有一种方法可以向客户提供这些细节。我只是不知道在哪里以及如何插入。
我希望解决方案是系统范围的,以便涵盖所有枚举,而不必将属性放在模型的属性或枚举本身上。 (这是因为我们将 API 模型作为 nuget 包分发,它不能有任何依赖项。)

最佳答案

我们最近遇到了这个问题,并编写了自己的属性来处理它:

public class ValidEnumValueAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
Type enumType = value.GetType();
bool valid = Enum.IsDefined(enumType, value);

if(!valid)
{
return new ValidationResult($"{value} is not a valid value for type {enumType.Name}");
}

return ValidationResult.Success;
}
}

class Person
{
public string Name {get; set;}

[ValidEnumValue]
public SexEnum Sex {get; set;}
}

然后将错误添加到 ModelState 中,以便您可以使用 ModelState.IsValid检查值是否有效。
if(!ModelState.IsValid)
{
return BadRequest(ModelState);
}

编辑

如果您不想使用属性,则可以从 NewtonSoft StringEnumConverter 派生一个新转换器并在读取 json 之前检查该值是否有效,例如
public class validEnumConverter : StringEnumConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if(!Enum.IsDefined(objectType, reader.Value))
{
throw new ArgumentException("Invalid enum value");
}

return base.ReadJson(reader, objectType, existingValue, serializer);
}
}

这将添加到您的启动类中的 JsonOptions 中:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddJsonOptions(options =>
{
options.SerializerSettings.Converters.Add(new validEnumConverter());
});
}

关于asp.net-web-api - 枚举值不解析时如何将枚举作为字符串绑定(bind)失败处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50365711/

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