带枚举输入参数的Webapi post方法

时间:2018-01-25 12:04:08

标签: c# asp.net-web-api2

为什么在尝试调用以枚举作为输入参数的Web API方法时,会在下面的屏幕截图中看到错误?我该如何解决这个问题?

无论我做什么,似乎messageDestinationType始终为空......

我更希望将输入类型保留为枚举。我很擅长使用web apis,并且无法理解当WCF完美处理这个场景时这是如此困难

[JsonConverter(typeof(StringEnumConverter))]    
public enum MessageDestinationType
{
    None = 0,
    [EnumMember(Value = "SMS")]
    SMS = 1,
    [EnumMember(Value = "Email")]
    Email = 2,
    PushNotification = 3,
    UXP = 4,
    IntermediaryApp = 5,
    YouthApp = 6
}



    [HttpPost, Route("ReadClientMessagesC")]
    public IHttpActionResult ReadClientMessagesC([FromBody]MessageDestinationType messageDestinationType)
    {
        var request = new ClientInboxRequest
        {
            Gcn = Gcn,
            ClientIpAddress = ClientIpAddress,
            CallingApplication = CallingApplication.Name,
            CallingApplicationVersion = CallingApplication.Version,
            CookieString = CookieString,
            HasPbUk = HasPbUk,
            HasIamIms = HasIamIms,
            HasPbZa = HasPbZa,
            HasSps = HasSps,
            HasWiUk = HasWiUk,
            HasWiZa = HasWiZa,
            LinkedGcns = LinkedGcns,
            RequestId = RequestId.ToString(),
            SsoProfiles = SsoProfiles.Select(x => x.Name).ToList()
        };

        MessageDestinationType messageDestination = (MessageDestinationType)messageDestinationType;

        return Ok(ClientMessageCenterHelper.ReadClientMessagesA(Gcn, messageDestination, request));
    }

enter image description here

  

错误讯息:{       "消息":"请求无效。",       " MessageDetail":"参数字典包含参数' messageDestinationType'的空条目。非可空类型' API.Domain.ClientMessageCenter.MessageDestinationType' for method' System.Web.Http.IHttpActionResult ReadClientMessagesC(API.Domain.ClientMessageCenter.MessageDestinationType)' in' ID.ClientMessageCenter.Controllers.ClientMessageCenterController'。可选参数必须是引用类型,可空类型,或者声明为可选参数。"   }

3 个答案:

答案 0 :(得分:1)

您可以将字符串(enum 的字符串名称)发送到 Web API 控制器(即使它具有与 OP 示例中的数值类似的数值)。 ASP.NET 框架已经为这种转换自动发生提供了条件 - 您只需要启用它。

在您的 Startup.cs ConfigureServices 方法中,将您的转换器添加到 JsonSerializerOptions.Converters 属性。

services.AddControllers()
    .AddJsonOptions(opts =>
    {
        opts.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
        opts.JsonSerializerOptions.IgnoreNullValues = true;
    });

我还建议将 IgnoreNullValues 设置为您偏好的设置,以使其非常明确。

信用:我从this post(由regisdiogo)解决了我的问题并无耻地复制到这里:-)

答案 1 :(得分:0)

您有几种不同的选择来解决这个问题:

  • 如果您可以更改发送到elsif ( Divisor !=0 ) and ((v_DIVIDEND/Divisor)-1 < ABS(0.2)) THEN insert into table(Divisor,b,c) values(Dividend,y,z) elsif Divisor = 0 THEN insert into table(Divisor,b,c) values(?,?,?); 的数据,请将数据作为ReadClientMessagesCint值)而不是Enum说明传递。< / LI>
  • 如果您无法更改传入数据,请将参数类型更改为Enum并使用方法正文中的Enum.Parse或;
  • 将方法保持为书面形式,并使用custom model binderstring转换为string

答案 2 :(得分:0)

您应该选择字符串或整数来代替枚举。

如果您仍然需要使用它,请将其解析为您的枚举。

就个人而言,如果我在使用RESTful API,我会更喜欢整数,因为你在这里有效地公开了一个Type。您可以通过Get / GetAll方法使这些类型可用,这样可以保持API的可维护性。