【问题标题】:Empty data send by jsonjson发送的空数据
【发布时间】:2014-02-10 17:37:21
【问题描述】:

由于未知原因,我在控制器中的函数接收到的数据始终为空。 我的数据已正确转换为 json。数据已发送但未收到(发送以成功结束)。

在这里你可以看到我的 Ajax 函数

$.ajax({
    url: "/Devices/Read",
    contentType: "text",
    type: "POST",
    datatype: "json",
    data: ko.toJSON(self),
    error: function (xmlHttpRequest, errorText, thrownError) {
        console.log("error")
    },
    success: function (data) {
        if (data != null) {
            console.log("success");
        }
    }
});

这是我在控制器中的功能:

[HttpPost]
public ActionResult Read(string data)
{
    return Json(new Object());
}

我试过了:

  1. 将参数类型更改为:ObjectString
  2. 将 contentType 更改为:textapplication/json; charset=utf-8

仍然没有效果。谁能建议我应该在哪里搜索错误?

更新: 将方法声明更改为:

public ActionResult Read(object[] data, string DeviceUser, string DeviceId, string number)

最后三个字符串没问题,但第一个对象由适当数量的元素组成,但它们为空。 在 JS 中,它们是类数组中的元素

我的 JS 对象的结构:

  var Eq = function (name, price) {
    var self = this;
    self.DeviceSerialNumber = ko.observable();
    self.Batch = ko.observable();

};
var ViewModel = function () {
    var self = this;
    self.data = ko.observableArray([]);
    self.DeviceUser = ko.observable();
    self.DeviceId = ko.observable();
    self.number = ko.observable(1);
};

【问题讨论】:

  • 你应该使用 jQuery 的 getJSON 函数。这会自动解析 json 数据。 api.jquery.com/jquery.getjson
  • 使用控制器中的Json() 方法返回您的JSON 将自动设置内容类型,因此您无需担心设置。您的方法当前返回一个空对象,所以我不确定您在期待什么?您可以编辑您的 OP 以包含您遇到问题的实际代码吗?

标签: ajax asp.net-mvc json knockout.js


【解决方案1】:

在你的控制器动作中,你为什么:

return RedirectToAction("Index"); 

我想你可能想要:

return Json(data);

【讨论】:

  • 此时它只是一个模型。将来此函数将调用将接收到的数据添加到数据库并在添加后将用户重定向到主页的方法。但是这个重定向也不起作用;)
  • 在您的 ajax 调用中,您指定了“数据类型:json”,您的控制器操作必须返回 JSON。否则,您应该指定“数据类型:html”。
  • 好的。我编辑了它。但这不是我的问题的重点。我问为什么我收到的数据是半空的。
  • 好的,现在我明白你的问题了。请参考stackoverflow.com/questions/3168401/…。关键是使用 JSON.stringify() 并设置正确的 contentType
  • 检查了这个问题。我的 Js 对象的 JSON.Stringify 返回空字符串,而 ko.ToJSON 是 Knockoutjs 的原生字符串化。所以问题不在这个地方
【解决方案2】:

如果您正在编写 HTTP Post 方法,那么重定向到操作实际上没有意义,因为您是在发布数据,而不是请求页面。 你可以这样做:

[HttpPost]
public ActionResult Read(string Data)
{
    return Json(Data);
}

【讨论】:

    【解决方案3】:

    OK 问题在于在方法中设置了正确的参数类型。

    要解决我的问题,我需要将方法声明修改为:

    public ActionResult Read(ViewModel m)
    

    并像这样添加 ViewModel:

      public class ViewModel
    {
        public List<InnerClass> data { get; set; }
        public string DeviceUser  {get;set;}
        public string DeviceId {get;set;}
        public int number {get;set;}
    
    }
    public class InnerClass
    {
        public string DeviceSerialNumber { get; set; }
        public string Batch { get; set; }
    }
    

    现在所有数据都已收到。

    感谢大家的帮助和建议。我会给大家+1 :)

    【讨论】:

      猜你喜欢
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 2015-12-07
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 2017-03-08
      相关资源
      最近更新 更多