为什么在尝试调用以枚举作为输入参数的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));
}
错误讯息:{ "消息":"请求无效。", " MessageDetail":"参数字典包含参数' messageDestinationType'的空条目。非可空类型' API.Domain.ClientMessageCenter.MessageDestinationType' for method' System.Web.Http.IHttpActionResult ReadClientMessagesC(API.Domain.ClientMessageCenter.MessageDestinationType)' in' ID.ClientMessageCenter.Controllers.ClientMessageCenterController'。可选参数必须是引用类型,可空类型,或者声明为可选参数。" }
答案 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(?,?,?);
的数据,请将数据作为ReadClientMessagesC
(int
值)而不是Enum
说明传递。< / LI>
Enum
并使用方法正文中的Enum.Parse或; string
转换为string
。答案 2 :(得分:0)
您应该选择字符串或整数来代替枚举。
如果您仍然需要使用它,请将其解析为您的枚举。
就个人而言,如果我在使用RESTful API,我会更喜欢整数,因为你在这里有效地公开了一个Type。您可以通过Get / GetAll方法使这些类型可用,这样可以保持API的可维护性。