2012-09-16 91 views
17

我有这样的代码:POST JSON与MVC 4 API控制器

$.ajax({ 


     type: "POST", 
     url: "/api/slide", 
     cache: false, 
     contentType: "application/json; charset=utf-8", 
     data: '{"Title":"fghfdhgfdgfd"}', 
     dataType: "json", 

的,这是我的CONTROLER:

public class SlideController : ApiController 
{ 

    // POST /api/Slide 
    public void Post(string Title) 
    { 
    } 

当我运行的代码,并调用/ API /幻灯片时,[标题]没有数据,为空。

如何将JSON发布到API控制器?

POST http://127.0.0.2:81/api/slide HTTP/1.1 
Host: 127.0.0.2:81 
Connection: keep-alive 
Content-Length: 18 
Origin: http://127.0.0.2:81 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1 
Content-Type: application/json; charset=UTF-8 
Accept: application/json, text/javascript, */*; q=0.01 
Referer: http://127.0.0.2:81/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

Title=fghfdhgfdgfd 

回答

21

定义视图模型:

public class SlideViewModel 
{ 
    public string Title { get; set; } 
} 

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

public class SlideController : ApiController 
{ 
    // POST /api/Slide 
    public void Post(SlideViewModel model) 
    { 
     ... 
    } 
} 

最后调用操作:

$.ajax({ 
    type: 'POST', 
    url: '/api/slide', 
    cache: false, 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify({ title: "fghfdhgfdgfd" }), 
    success: function() { 
     ...  
    } 
}); 

原因是简单的类型如字符串是从URI绑定的。我还邀请您阅读关于Web API中模型绑定的following article

+0

我无法理解它是如何知道我们试图调用哪个动作的?在这个控制器中,我们可以有数百个。 – webdeveloper

+2

它是RESTful和传统的。你在你的jQuery请求中使用POST动词=> Post动作被调用。如果您使用'GET'动词(例如直接在您的浏览器地址栏中输入动作名称)=> Get动作将被调用。所以你不能有数百个。标准的HTTP动词是'GET','POST','PUT'和'DELETE',这些是你应该使用的动作名称。当然,你总是可以违反标准的RESTful约定=>继续并在你的'〜/ App_Start/WebApiConfig.cs'文件中修改路由,以便在URL中包含动作名称。 –

+0

我想知道数据之间有什么区别:JSON.stringify({title:“fghfdhgfdgfd”})和data:'{Title:“fghfdhgfdgfd”}',我最终使用了什么? – user1615362

2

试试这个:

$.ajax({ 
    type: "POST", 
    url: "/api/slide", 
    data: { Title: "fghfdhgfdgfd" } 
}); 

它是围绕着数据属性引号这是导致此:

即>>数据是:{title: “fghfdhgfdgfd”}
不> >数据:' {标题:“fghfdhgfdgfd”} '

更新:
此外控制器似乎有些奇怪,虽然这是很难说没有看到你的路由等

我希望看到更多的东西是这样的:

public class SlideController : ApiController 
{ 
    public HttpResponseMessage PostSlide(string Title) 
    { 
     // Do your insert slide stuff here.... 

     string uri = Url.Link("DefaultApi", new { id = item.Id }); 
     response.Headers.Location = new Uri(uri); 
     return response; 
    } 
} 

显然,你还需要更新jQuery中的URL。

到这里看看:

http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

另一个更新:

这将是通常创建一个CLR对象,以配合您的JSON和使用MVC模型绑定,直接绑定到这一点。如果你不想这样做,你可以绑定到一个对象和反序列化到一个解释:

// POST api/values 
public void Post(object json) 
{ 
    Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json.ToString()); 
    var x = values["Title"]; 
} 
+0

这个变化没有帮助,当我在控制器中断点时,我仍然会得到空值。 – user1615362

+0

只是发布了一个更新到我原来的答案。 –

+0

您确定您使用的是MVC 4 API控制器吗?我正在使用默认的MVC 4 API控制器脚手架和空方法。 – user1615362

9

确保您尝试转换为的对象具有默认(空)构造函数。经验法则:如果你想反序列化一个对象,你需要简化对象的创建过程。这些准则可以帮助:

  • 是围绕传递所有的属性必须是公共

  • 对象需要能够是不带任何参数构建

这JSON串/例如对象:

{ Name: "John Doe", Phone: "123-456-7890", Pets: [ "dog", "cat", "snake" ] } 

可以从下面的类被转换为一个对象:

public class Person { 

    public string Name { get; set; } 
    public string Phone { get; set; } 
    public string[] Pets { get; set; } 

    } 

或这一个:

public class Person { 

    public string Name { get; set; } 
    public string Phone { get; set; } 
    public string[] Pets { get; set; } 
    public Person() {} 
    public Person(string name, string phone) { 
     Name = name; 
     Phone = phone; 
    } 

} 

或这个:

public class Person { 

    public string Name { get; set; } 
    public string Phone { get; set; } 
    public string[] Pets { get; set; } 
    public Person() {} 


} 

,但不是这样的一个

public class Person { 

    public string Name { get; set; } 
    public string Phone { get; set; } 
    public string[] Pets { get; set; } 
    public Person(string name, string phone) { 
     Name = name; 
     Phone = phone; 
    } 

} 

现在让ASP.NET MVC 4做休息

public class PersonController : ApiController 
{ 
     // .. other actions 
     public HttpResponseMessage PostPerson(Person person) 
     { 
      if (null != person) 
       // CELEBRATE by doing something with your object 
      else 
       // BE SAD and throw and exception or pass an error message 

     } 
     // .. other actions 
} 

如果你的类不能有一个默认的构造函数,或者如果你没有获取该类的源代码,您可以创建一个适配器类,该类适配器类型为

  • 有一个默认的构造函数
  • 暴露那些需要公开

使用上面没有默认构造函数Person类的属性,适配器可能看起来像

public class PersonAdapter { 

    public Person personAdaptee; 

    public string Name { 
     get { return personAdaptee.Name; } 
     set { personAdaptee.Name = value } 
    } 

    public string Phone { 
     get { return personModel.Phone; } 
     set { personModel.Phone = value; } 
    } 

    public string[] Pets { 
     get { return personAdaptee.Pets; } 
     set {personAdaptee.Pets = value } 
    } 

    public PersonAdapter() { 

     personAdaptee = new Person("", "", null); 

    } 

} 

现在让ASP.NET MVC 4做休息

public class PersonController : ApiController 
{ 
     // .. other actions 
     public HttpResponseMessage PostPerson(PersonAdapter person) 
     { 
      if (null != person) 
       // CELEBRATE by doing something with your object 
      else 
       // BE SAD and throw and exception or pass an error message 

     } 
     // .. other actions 
} 
1

演员的动作参数FromBody即:

public class SlideController : ApiController 
{ 

    // POST /api/Slide 
    public void Post([FromBody]string Title) 
    { 
    } 
} 
0
$.ajax({ 
    type: 'POST', 
    url: '/api/slide', 
    cache: false, 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify({ title: "fghfdhgfdgfd" }), 
    success: function() { 
     ...  
    } 
}); 

控制器是

public class SlideController : ApiController 
{ 

    // POST /api/Slide 
    public void Post(string Title) 
    { 
    } 

您的网址无效,网址必须解决的行动邮政幻灯片控制器

编辑您的网址URL: “~/ControllerName/ActionName” 在这个背景必须是Url:"~/Slide/Post"