WebAPI数据框架忽略了自定义EnumConverter

发布于 2025-02-09 22:52:27 字数 1291 浏览 1 评论 0原文

我有以下enumenumConverter

[TypeConverter(typeof(MyEnumConverter))]
public enum MyEventType {
  Unknown,
  URLEvent
}

public class MyEnumConverter : EnumConverter
{
    public MyEnumConverter(Type type) : base(type)
    {
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        if (value is string)
        {
            var enumString = (string)value;
            return EnumExtensions.GetValueFromDescription(enumString, EnumType);
        }
        return base.ConvertFrom(context, culture, value);
    }
}

我还有一个WebAPI控制器,该webAPI控制器接受一个对象,该对象包含上述枚举类型的属性:

[Route("api/v1/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
   [Route("events")]
   [HttpPost]
   public IActionResult HandlePost([FromBody] MyEvent myEvent)
   {
       // Do whatever here
   }
}

public class MyEvent 
{
   public MyEventType eventType {get; set;}
}

但是,如果i post {“ eventType”:“ urlevent”}到控制器,我得到一个错误:“无法转换JSON值... convertfrom()我可以看到它永远不会被调用。

我需要做什么才能使Web API数据限制使用我的EnumConverter?

I have the following enum and EnumConverter:

[TypeConverter(typeof(MyEnumConverter))]
public enum MyEventType {
  Unknown,
  URLEvent
}

public class MyEnumConverter : EnumConverter
{
    public MyEnumConverter(Type type) : base(type)
    {
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        if (value is string)
        {
            var enumString = (string)value;
            return EnumExtensions.GetValueFromDescription(enumString, EnumType);
        }
        return base.ConvertFrom(context, culture, value);
    }
}

I also have a WebAPI controller that accepts an object that contains a property of the above enum type:

[Route("api/v1/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
   [Route("events")]
   [HttpPost]
   public IActionResult HandlePost([FromBody] MyEvent myEvent)
   {
       // Do whatever here
   }
}

public class MyEvent 
{
   public MyEventType eventType {get; set;}
}

However, if I POST {"eventType" : "URLEvent"} to the controller, I get an error: "The JSON value could not be converted ..." Placing a break-point in ConvertFrom() I can see that the it is never being called.

What do I need to do to get the Web API databinding to use my EnumConverter?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

关于从前 2025-02-16 22:52:27

以下是解决您当前问题的两种替代方法:

第一个:System.Text.json serialization

services
    .AddMvc()
    // Or .AddControllers(...)
    .AddJsonOptions(opts =>
    {
        var enumConverter = new JsonStringEnumConverter();
        opts.JsonSerializerOptions.Converters.Add(enumConverter);
    })

可以找到该文档在这里

第二:newtonsoft.json

Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson

,然后:

services.AddControllers().AddNewtonsoftJson();

测试结果:

“

”在此处输入图像说明”

Here are two alternatives to solve your current problem:

First:System.Text.Json serialization:

services
    .AddMvc()
    // Or .AddControllers(...)
    .AddJsonOptions(opts =>
    {
        var enumConverter = new JsonStringEnumConverter();
        opts.JsonSerializerOptions.Converters.Add(enumConverter);
    })

The documentation can be found here.

Second:Newtonsoft.Json

Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson

And then:

services.AddControllers().AddNewtonsoftJson();

Test Result:

enter image description here

enter image description here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文