2012-10-17 362 views
2

我已经搜索了一整天,但仍无法找到答案。我需要POST数据通过jQuery.postWeb API MVC-4但无法。这是我的路由:如何在asp.net web api中使用接收POST数据?

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

,这是我Controller(在GET作品!):

public string Get(int id) 
    { 
     return "value"; 
    } 

    public void Post([FromBody]string data) 
    { 
     //body... 
    } 

这是jQuery.post:

$.post('api/mycontroller', { key1: 'val1' }); 

任何想法?

编辑:

@Darin:我尝试这样做:

public class UnitDetails{ 
    public string id { get; set; } 
} 

和:

public void Post(UnitDetails id) { 
    //body... 
} 

和:

$.post('api/mycontroller', {id:'string1'}); 

但我仍想念的东西..它不停止在Post(...){...}。再次 - Get(...){...}确实工作..?

+0

API控制器有特殊路由,可以通过'MapHttpRoute'而不是'MapRoute'识别。默认情况下,它们是在App_Start/WebApiConfig.cs中定义的。这个路由配置是什么样的? –

回答

6

这是由设计并制作了原始类型这项工作如字符串的唯一途径是:

$.post('/api/mycontroller', '=' + encodeURIComponent('val1')); 

所以POST请求的主体必须包含以下内容:

代替
=val1 

data=val1 

这已在this thread讨论。

正如你可以定义一个视图模型替代:

public class MyViewModel 
{ 
    public string Data { get; set; } 
} 

,然后让你的控制器动作持这种观点模型参数:

public void Post(MyViewModel model) 
{ 
    //body... 
} 

相反,基本类型,复杂类型使用格式化而不是模型绑定。这里的an article涵盖了Web API如何进行参数绑定。

+0

我尝试了您的建议(请参阅上述问题的编辑),但没有成功。 – Tar

+0

将您的动作参数重命名为与“id”不同的内容。例如:'public void Post(UnitDetails details){...}'。 –

0

您发布的内容为api/mycontroller。 ASP.NET MVC会自动附加'Controller'提供的名称,因此它正在寻找名为mycontrollerController的控制器。您的帖子中未提及您的API控制器的名称,但我怀疑这不是。

假设您的控制器被命名为'myController',请尝试发布到api/my

$.post('api/my', { id: 'string1' }); 
相关问题