2016-06-07 62 views
1

我正在使用Postman来测试我编写的PUT Web API方法,但不管我尝试使用强类型化参数,我传递(MyModel)始终为null。Web API Put - 传递的参数为null

控制器动作

[Route("api/myapiname/{id}/{name}")] 
[HttpPut] 
public HttpResponseMessage Put(int id, string name, MyModel mymodel) 
{ 
    *//Do stuff* 
} 

为MyModel类

public class MyModel 
{ 
    public MyModel() { } 

    private Boolean _b; 
    public Boolean b { set { _b = value; } get { return _b; } } 

    private String _comments; 
    public String comments { set { _comments = value; } get { return _comments;    }} 
} 

URL

http://localhost:37781/api/myapiname/123456/laura 

邮差

PUT: URL above 

Headers: 
Content-Type: application/json 

Body: 
{ 
"MyModel":[{"b": true,"comments": "Comments go here"}] 
} 

我试图改变这一行:

public HttpResponseMessage Put(int id, string name, MyModel mymodel) 

public HttpResponseMessage Put(int id, string name, [FromBody]MyModel mymodel) 

和邮差改变内容类型到的X WWW窗体-urlencoded和我我也尝试更改传递给的内容: = [{“b”:true,“评论”:“评论转到此处”}]

我已经尝试了StackOverflow上提供的各种解决方案,但没有尝试工作,有人可以帮我吗?

回答

2

当行动期待一个单一的MyModel对象时,您的邮递员请求正在显示具有正文中的数组属性的对象。

这是符合您的例子动作的请求的原始片段:

PUT /api/myapiname/123456/laura HTTP/1.1 
Host: http://localhost:37781 
Content-Type: application/json 
... 
Content-Length: 42 

{"b": true,"comments": "Comments go here"} 

这个动作:

[Route("api/myapiname/{id}/{name}")] 
[HttpPut] 
public HttpResponseMessage Put(int id, string name, MyModel mymodel){...} 

应与上述要求的工作。

要强制网络API来读取从请求主体中的简单类型,所述 [FromBody]属性添加到参数。

JSON的在你的邮递员请求将解析到一个像这样的对象...

public class MyObject { 
    public MyModel[] MyModel {get; set;} 
} 

所以,你要么需要改变你的要求,以配合您所定义的动作或改变你的行动,以配合请求

[Route("api/myapiname/{id}/{name}")] 
[HttpPut] 
public HttpResponseMessage Put(int id, string name, MyObject mymodel){...} 
+0

感谢您的帮助。 我改变了邮递员请求正文:{“b”:true,“评论”:“评论去这里”}但当我使用VS调试代码对象显示它的属性与默认值/ null,而不是值从邮差传递。 我试着添加[FromBody]属性,这也没有帮助。 – Laura

+0

忽略我最后的评论,我指定了不正确的参数名称。它现在在工作,非常感谢。 – Laura