Web api map请求参数,带有连接到Pascal的复杂模型属性的连字符

时间:2015-04-11 07:13:23

标签: asp.net-web-api mailgun

我试图想出一种方法将带有连字符的POSTED表单参数映射到采用复杂对象的WEB-API方法。

某些背景信息:

我们正在使用Mailgun将已处理的电子邮件转发到我们自己的自定义Web API控制器方法。

Mailgun POSTS到我们的API,它使用的一些参数中包含连字符 - 例如:body-plain。

我的C#复杂模型将具有在Pascal Case中匹配的属性(不能在属性名称中使用连字符)

所以如果这些参数是由Mailgun生成并发布到我们的WEB API控制器:

   from
   subject
   body-plain
   body-stripped
   timestamp

我们的复杂对象如下所示:

public class Response{
   public string From{get; set;}
   public string Subject{get; set;}
   public string BodyPlain{get; set;}    
   public string BodyStripped{get; set;
   public int Timestamp{get; set;}
}

然后From,Subject和Timestamp都正确映射 - 但BodyPlain和BodyStripped没有 - 它们是null,因为模型绑定不能将带连字符的参数转换为Camelcase。

有办法做到这一点吗?

我看过一些帖子提到了使用MVC实现这一目的的不同方法,但我们并没有使用MVC,只是严格的WEB API。

2 个答案:

答案 0 :(得分:1)

您可以使用控制器中的-keepclassmembers class com.smartmedia.musicplayer.api.AppSetting.** { *; } 对象,这将使参数可用键/值样式。

在Mailgun转发的情况下(我遇到了同样的问题),Request方法将公开Request.ReadFormAsync(),您可以从中通过以下方式访问所需的参数:

IFormCollection

答案 1 :(得分:0)

由于参数是通过表单提交而不是JSON发送的,因此使用[JsonProperty(PropertyName = "my-param")]将无济于事,您必须采取行动,使操作接收类型为FormDataCollection的参数,然后在内部操作,您将其映射到您的复杂对象。另一种方法是实现自定义模型联编程序。

在此post中,有关于这两个选项的详细信息。