4

我正在研究 ASP.NET Web API,但是在关于来自请求正文的复杂类型的解释中,作者让我感到困惑:

专业的 ASP.NET MVC 4:第 11 章 - ASP.NET Web API

“[..] 复杂类型(其他所有内容)都取自主体。还有一个额外的限制:只有一个值可以来自主体,并且该值必须代表整个主体。[... ]"

布拉德·威尔逊

他说的“单一价值可以来自身体”是什么意思?API 格式化程序只能从正文中解析一种类型的对象?你能举例说明这一点吗?

4

2 回答 2

4

正文中只能有一个值

假设您有这样的请求正文。

{"Id":12345, "FirstName":"John", "LastName":"West"}

您希望将此 JSON 绑定到此类类型的参数。

public class Employee
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

动作方法可以像void Post(Employee emp). 而且不可能是这样的—— void Post(Employee john, Employee duplicateJohn)。只有一个值可以来自正文。

并且该值必须代表整个身体

假设您有相同的请求正文,如下所示。

{"Id":12345, "FirstName":"John", "LastName":"West"}

你有两个这样的 DTO。

public class Identifier
{
    public int Id { get; set; }
}

public class Name
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

您不能拥有类似的操作方法void Post(Identifier id, Name name)并期望主体部分绑定到两个参数。整个正文必须只绑定一个值。所以,有一个像

public class Employee
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

void Post(Employee emp)并且只允许将请求正文整体绑定到一个值,例如。

于 2013-08-08T17:55:15.257 回答
1

这基本上意味着您不能拥有描述多个复杂类型的多部分正文。假设你有一个User类型,整个主体必须​​描述该User类型而不是User+ShoppingChart类型。

类型的有效主体User

{
   "id" : "1",
   "username" : "someuser"
}

类型无效的主体User

{
   "user" : {
      "id" : "1",
      "username" : "someuser"
   },

   "shoppingCart" : {
      "cartId" : "1",
      "items" : "5"
   }
}

当然,您可以创建一个新的复杂类型,例如UserAndShoppingCart(它使用用户和购物车类作为属性),现在无效的主体将是有效的,并且对于这种新类型是可反序列化的。

于 2013-08-08T15:48:09.937 回答