2016-09-16 58 views
0

当我在MVC控制器如何将Json参数绑定到ASP.NET中的Web Api参数?

[HttpPost] 
public async Task<ActionResult> MyMethod(int param1, string param2) 
{ 
    //.... 
} 

这种方法我可以送一个JSON对象{param1:1, param2:"str"}只是正常工作和参数都解决了。但是,当我为WebApi 2执行此操作时不起作用。由于[FromBody]只能按文件中的以下示例使用1个参数。

At most one parameter is allowed to read from the message body 
    // Caution: Will not work!  
    public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... } 

如何从WebApi控制器获得相同的MVC控制器行为?

编辑:创建相应的类和替换参数不是一个选项,因为消息传递工具会检查这些方法以进行维护。签名应该保持不变。

+0

您编辑提供不可能的任务 - 最多一个参数可以从正文读取为:“此规则的原因是请求正文可能存储在一个只能读取一次的非缓冲流“。 –

+0

@VadimLevkovsky你是绝对正确的。但是,由于签名保持不变,我只是让方法同时接受GET和POST。当我们用URL中的参数发送GET时,它就起作用了。 – ozgur

+0

无法做到这一点是无效的 – Ewan

回答

1

尝试从这些值构成一个对象:

public class Foo 
{ 
    public int id {get;set;} 
    public int name {get;set;} 
} 

public HttpResponseMessage Post([FromBody] Foo foo) 
{ 
    //some stuff... 
} 

如果签名应保持不变,你可以尝试在URL中指定参数,可以这样:myurl?id=1&name=Tom仍然通过POST动词。

+0

签名应保持不变,因为消息传递基础结构会不时检查这些控制器方法。我会用这个细节编辑我的问题。 – ozgur

0

如果你要传递多个参数,请使用类对象

public class PortalClass 
{ 
    public ApplicationModel applicationModel { get; set; } 
    public string user_id { get; set; } 
    public string id { get; set; } 
    public object pageCollection { get; set; } 
} 

public object GetApplication(PortalClass data) 
{ 
    JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All, PreserveReferencesHandling = PreserveReferencesHandling.None }; 
    var myObject=JsonConvert.DeserializeObject<PageCollection>(data.pageCollection.ToString(), settings) 
    return null; 
} 

客户端:

var data = { 
    user_id: userId, 
    id: id 
}; 

http.post(url, data).then(
    function (response) { 

}, function (err) { 
    callback.reject(err); 
}); 
+0

签名应保持不变,因为消息传递基础结构会不时检查这些控制器方法。 – ozgur

2

你可以尝试这样的:

public HttpResponseMessage Post([FromBody]dynamic value) 
{ 
    int id= value.id.ToString(); 
    string name = value.name.ToString(); 
} 

并通过json像followin g

{ 
    "id":"1", 
    "name":"abc" 
} 
+0

不要对这些事情使用动态,因为您通常知道从前端获得的数据。 –

+0

是的,但是如果你不想创建新的类来传递值给一个方法,并且你在控制器中有很多方法,那么你会怎么做? –

+0

我确实创建了类。所有请求/响应都可能具有语义(甚至物理)值域对象。为什么不把它们明确地暴露为类?如果有很多类没有意义 - 我会把它当作代码味,并考虑API重构。 –