【问题标题】:WebApi complex object returned as nullWebApi 复杂对象返回为 null
【发布时间】:2015-10-07 23:48:39
【问题描述】:

我有一个 ASPNET WebApi 2 项目,在控制器中我有两个操作

 public IHttpActionResult Get([FromUri] Company company)
 {
    //code
 }

和其他:

[HttpGet]
[Route("api/company/quantity")]
public IHttpActionResult Count([FromUri] Company company)
{
      //code
}

公司类:

  public class Company 
  {
    public Company()
    { 
       Name = "";
       //Set default value to all properties
    }
    public string Name {get;set;}
    //othger string properties
  }

如果我使用此 uri 访问第一种方法 Get://localhost/api/company/ 一切正常,@ 987654324@ 对象带有默认值。

但如果我尝试使用此 uri 访问第二种方法计数://localhost/api/company/quantity 该方法被命中,但 Company 对象一片空白。

怎么了?

【问题讨论】:

  • 将 DataContract 和 DataMember 属性添加到 Company 类。

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


【解决方案1】:

您需要更改第二种方法的路线属性并将公司放入括号中。

[HttpGet]
[Route("api/{company}/quantity")]
public IHttpActionResult Count([FromUri] Company company)
{
    //code
}

但是,您是否尝试通过 URL 传递复杂对象?您最好切换到 POST/PUT 方法并从请求正文绑定对象。

【讨论】:

  • 是的,但它不是我自己的项目,正在研究中,以后会尝试更改它。
  • 公司也是控制器的名称。问题是在第一种方法(Get(Company company))中,公司构造函数在操作之前被命中,所以它带有默认值。但是在第二种方法(Count(Company company))中,Company 构造函数没有命中,所以对象为空。在这两种情况下,我都没有在 url 中传递任何内容。
  • 我们不应该仅仅因为我们试图“传递一个复杂的对象”而使用 POST。应该尊重 REST 语义:如果我们试图 GET 某些东西,我们不应该使用 POST 来获取它。 POST 意味着改变状态,GET 意味着检索信息。
【解决方案2】:

您不能使用 httpget 传递复杂的对象,例如类

【讨论】:

  • 是的,但为什么在第一种方法中它有效?它也是动词。
猜你喜欢
  • 1970-01-01
  • 2013-05-26
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2016-05-20
  • 1970-01-01
相关资源
最近更新 更多