首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MVC 4 API控制器发布JSON

使用MVC 4 API控制器发布JSON
EN

Stack Overflow用户
提问于 2012-09-16 18:03:47
回答 5查看 45.3K关注 0票数 17

我有这样的代码:

代码语言:javascript
复制
   $.ajax({


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

这是我的控制器:

代码语言:javascript
复制
public class SlideController : ApiController
{

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

当我运行代码并调用/api/Slide时,标题没有数据并且为空。

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

代码语言:javascript
复制
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
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-09-16 20:11:18

定义视图模型:

代码语言:javascript
复制
public class SlideViewModel
{
    public string Title { get; set; }
}

然后让您的控制器操作将此视图模型作为参数:

代码语言:javascript
复制
public class SlideController : ApiController
{
    // POST /api/Slide
    public void Post(SlideViewModel model)
    {
        ...
    }
}

最后调用该操作:

代码语言:javascript
复制
$.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

票数 21
EN

Stack Overflow用户

发布于 2012-09-22 08:08:41

确保您尝试转换到的对象具有默认(空)构造函数。

经验法则:如果你想反序列化到一个对象,你需要让创建的对象变得简单。这些指导原则可以帮助您:

  • 要传递给的所有属性都必须是
  • 对象必须能够在没有任何的情况下进行构造

例如,此JSON字符串/对象:

代码语言:javascript
复制
{ Name: "John Doe", Phone: "123-456-7890", Pets: [ "dog", "cat", "snake" ] }

可以从以下类转换为对象:

代码语言:javascript
复制
 public class Person {

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

  }

或者这个:

代码语言:javascript
复制
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;
   }

}

或者这个:

代码语言:javascript
复制
public class Person {

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


 }

但不是这个

代码语言:javascript
复制
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来做剩下的事情。

代码语言:javascript
复制
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类,适配器可能如下所示

代码语言:javascript
复制
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来做剩下的事情。

代码语言:javascript
复制
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 
}
票数 10
EN

Stack Overflow用户

发布于 2012-09-16 18:25:50

试试这个:

代码语言:javascript
复制
$.ajax({
    type: "POST",
    url: "/api/slide",
    data: { Title: "fghfdhgfdgfd" }
});

这是由data属性周围的引号引起的:

即>>数据:{标题:"fghfdhgfdgfd“}

非标题数据:'{ >>:"fghfdhgfdgfd“}'

更新:

而且你的控制器看起来有点奇怪,尽管如果不看你的路由就很难判断,等等。

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

代码语言:javascript
复制
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模型绑定器直接绑定到该对象。如果你不想这样做,你可以绑定到一个对象并反序列化到一个字典中:

代码语言:javascript
复制
// POST api/values
public void Post(object json)
{
    Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json.ToString());
    var x = values["Title"];
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12446024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档