MVC 4 WebApi Formatter弄乱了我的实体

时间:2012-08-25 14:04:11

标签: asp.net-mvc-4 asp.net-web-api model-binding azure-table-storage

我正在使用MVC 4 WebApi将多个实体发布到Azure Table Storage。我相信它使用的是格式而不是模型绑定,因为它们是复杂的类型(我编写的类),它们被发送到正文中的API,而不是URI。

这适用于所有实体,除了一个实体(一个名为Comment的类),它指向其他实体(它具有其他实体的属性)。我传入主体API的JSON有2个包含其他实体的属性。

对于Azure表存储,每个实体都具有RowKey属性。我注意到,一旦我的控制器从请求体中的JSON构建实体(使用MVC4格式化),它就具有错误的RowKey值 - 它实际上具有2个属性中引用的实体之一的值我提到。这个其他实体的RowKey属性也包含在JSON中 - 所以JSON有3个RowKeys,但它们都正确地位于JSON中,成为正确实体的一部分。 Formatter似乎只是读错了。

我无法保存此评论。我不认为关键问题是原因,因为表存储服务不应该关心(没有验证),但我认为这只是使Azure表存储服务无法实现该实体的问题的一部分。有没有像这样的MVC格式有类似的问题?

谢谢!

修改 我忘了提 - 为了测试,如果我在格式化程序正在破坏的同一个控制器方法中实例化一个新的Comment实体,它就可以保存得很好。所以我很确定在WebApi解析传递给控制器​​的Post方法的实体时会出现问题。

添加JSON和模型:

{
  "PartitionKey": "US",
  "RowKey": "com-dd1920ed-2e87-4f51-a6d1-32fa692aadae",
  "AboutKey": "US|per-fb1de571-7142-47c8-bdb3-0eddd59f6ccd",
  "FromPersonKey": "US|per-4c3261d8-3b1a-4bd4-8850-4d769cfbd7ef",
  "CommentText": "Testing Create.",
  "FromPerson": {
    "PartitionKey": "US",
    "RowKey": "per-4c3261d8-3b1a-4bd4-8850-4d769cfbd7ef",
    "FirstName": "John",
    "LastName": "Smith",
    "NickName": null,
    "FullName": "John Smith",
    "Description": null,
    "ImageLocation": null,
    "Region": "US"
  },
  "About": {
    "PartitionKey": "US",
    "RowKey": "per-fb1de571-7142-47c8-bdb3-0eddd59f6ccd",
    "FirstName": "George",
    "LastName": "Martin",
    "NickName": "Cowboy Hat",
    "FullName": "George Martin",
    "Description": "Ten gallons big.",
    "ImageLocation": null,
    "Region": "US"
  },
  "CommentDateTime": "2012-08-25T13:41:09.8899185Z"
}

模型(从JSON绑定错误,从调试本地窗口发布)。您将在此处注意到的另一个问题是“About”属性为null。这应该是一个Person对象,但Json.Net似乎并没有解析这个属性,大概是因为它是一种接口而不是类。显然在这里,它是一个在JSON中传递该属性的人,但它可能是其他东西,因此在那里使用接口:

comment         {Classes.Comment}                           Classes.Comment  
About           null                                        Classes.ICommentable  
AboutKey        US|per-fb1de571-7142-47c8-bdb3-0eddd59f6ccd string  
CommentDateTime {1/1/0001 12:00:00 AM}                      System.DateTime  
CommentText     Testing Create.                             string  
FromPerson      {Classes.Person}                            Classes.Person  
FromPersonKey   US|per-4c3261d8-3b1a-4bd4-8850-4d769cfbd7ef string  
PartitionKey    US                                          string  
RowKey          per-fb1de571-7142-47c8-bdb3-0eddd59f6ccd    string  

0 个答案:

没有答案