【问题标题】:ASP.NET MVC JSON body with POST带有 POST 的 ASP.NET MVC JSON 正文
【发布时间】:2015-08-16 12:12:33
【问题描述】:

我是 ASP.NET MVC 和学习的新手。到目前为止,我已经弄清楚如何创建一个 JSON 对象并将其作为对请求的响应返回。但是,我无法像通常使用Java 那样将JSON 正文作为POST 请求的一部分传递。

这是我在那里执行此操作的代码 -

@Path("/storeMovement")
@POST
@Consumes("application/json")
@Produces("application/json")
public String storeTrace(String json) {
  JSONObject response = new JSONObject();
  JSONParser parser = new JSONParser();
  String ret = "";

  try {
      Object obj = parser.parse(json);
      JSONObject jsonObj = (JSONObject) obj;

      RecordMovement re = new RecordMovement((double) jsonObj.get("longitude"), (double) jsonObj.get("latitude"), (long) jsonObj.get("IMSI"));
      ret = re.Store();

      // Clear object
      re = null;
      System.gc();

      response.put("status", ret);
  } catch (Exception e) {
      response.put("status", "fail " + e.toString());
  }
  return response.toJSONString();
}

我在 ASP.NET Action 方法中尝试了相同的方法,但string 参数a 中的值是null,如调试时所见。这是 Action 方法的代码 -

public string Search(string a)
{
    JObject x = new JObject();

    x.Add("Name", a);

    return x.ToString();
}

当我像这样使用Object(例如 - Book)时,它工作正常 -

public string Search(Book a)
{
    JObject x = new JObject();

    x.Add("Name", a.Name);

    return x.ToString();
}

在这种情况下,这本书的名称会像我预期的那样被反序列化。 Book 类的类定义 -

public class Book
{
    public int ID { get; set; }
    public string Name { get; set; }
}

有人可以告诉我我做错了什么吗?有没有办法接受一个字符串并然后反序列化?我希望能够接受JSON 而不必使用对象

【问题讨论】:

  • 如何调用控制器方法?您可以发布帖子请求部分吗?
  • 尝试使用带有(string Name)的方法参数
  • @vinayan 我现在使用 Chrome 的 POSTMAN 附加组件进行发布请求。我添加了一个标头,指示内容类型为application/json。请求类型设置为 POST 并具有 JSON 正文 - { "Name": "Normally", "ID": 55 }
  • @AjayKelkar 检查我的回答是否有帮助

标签: c# json asp.net-mvc rest


【解决方案1】:

asp.net mvc中发布数据的第一件事就是用这个属性装饰方法[Httpost] 这意味着传递一个字符串 应该是这样的

[HttpPost]
public string Search(string a){
    // your code
}

默认值为 [HttpGet] 从 url 获取参数。对于 Post 请求,您需要这样做。

编辑:

看看vinayan的答案

使用 jquery:

$.ajax({
  method: "POST",
  url: "Home/Search",
  data: {'a': 'yourstring'}
})

【讨论】:

  • 谢谢!添加了注释,但仍然无效。参数a 仍显示null 值。因此,除此之外,我还添加了@vinayan 所说的关于让 JSON 中的键名与参数名匹配的内容,现在它可以工作了。所以我从这个问题中吸取了两个关键教训:)
【解决方案2】:

据了解,您希望将整个请求正文传递给一个没有任何绑定的字符串,这样您就可以用您想要的方式处理传递的字符串数据。

为了达到这个目的,只需编写您自己的模型绑定器:

public class RawBodyBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if(typeof(string)!=bindingContext.ModelType)
             return null;

        using (var s = new StreamReader(controllerContext.HttpContext.Request.InputStream))
        {
            s.BaseStream.Position = 0;
            return s.ReadToEnd();
        }      
    }
}

然后在你的操作方法中将你的活页夹分配给所需的参数:

public string MyAction([ModelBinder(typeof(RawBodyBinder))]string json)
{
}

但是 MVC 也有自己的 JSON 模型绑定器,如果您的数据是标准 JSON 并且在带有 Content-Type: application/json 标头的请求正文中,您可以使用 MVC 的 JSON 模型绑定器来激活 JSON 模型绑定器,只需在 Global.asax.cs 文件中添加以下行:

protected void Application_Start()
{
    // some code here

    ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
}

【讨论】:

    【解决方案3】:

    您发送的参数名称用于反序列化。所以在这种情况下,“a”应该是 json 的一部分。

    public string Search(string a)
    

    所以你必须使用,

    $.ajax({
      method: "POST",
      url: "Home/Search",
      data: {'a': 'yourstring'}
    })
    

    【讨论】:

    • 谢谢!除了在方法中添加 [HttpPost] 注释之外,我还这样做了,然后它就起作用了
    猜你喜欢
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2016-09-29
    • 1970-01-01
    • 2011-11-08
    • 2016-09-24
    相关资源
    最近更新 更多