【问题标题】:C# JSON Post From JavaScript来自 JavaScript 的 C# JSON 发布
【发布时间】:2013-10-14 13:46:38
【问题描述】:

我有以下 2 个保存数据的类:

public class ItemList{
    public IList<Item> Items{get;set;}
}

public class Item{
    public int id {get;set}
    public string name {get;set}
}

我的控制器看起来像:

 public virtual JsonResult SaveItems(ItemList items)
    {}

我尝试像这样发布一个 JS 对象:

var toPost = { "items" : [ {"id" : 1, "name":"test}, {"id" : 1, "name":"test"}] }


   $.ajax({
                        type: "POST",
                        url: "URL TO POST TO",
                        dataType: "json",
                        data: toPost,
                        traditional: true,
                        success: function (data, status, request) {
                            if (data.Error != undefined) {
                                alert("System Error: " + data.Error);

                                return;
                            }
                            console.log("Success");

                        },
                        error: function (request, status, error) {
                            console.log("ERROR");
                        }
                    });

我在发布之前做了一个console.log,数据看起来与toPost 变量中描述的一样,但是在C# 端调试时ItemList items 为空

【问题讨论】:

  • 尝试大写 I 的项目(在你的班级和 json 字符串中不同)
  • 内容类型属性在哪里?
  • 它的数据类型:“json”我使用
  • 数据类型用于响应。你需要内容类型
  • Items 中的I 需要大写,你需要_contentType 属性。

标签: c# javascript json null


【解决方案1】:

在 toPost 中使用JSON.stringify 并设置内容类型

$.ajax({
                    ...
                    contentType: "application/json; charset=utf-8"
                    data: JSON.stringify(toPost),
                    ...
});

【讨论】:

  • 当你将它字符串化时,它就是一个字符串。那么为什么上下文类型是 JSON 而不是字符串呢?
  • stringify 将对象序列化为 JSON 字符串,以便将其传输到服务器。内容类型是让服务器知道字符串是什么——可以是 JSON、查询字符串、XML 等。
  • HTTP 不理解 JSON。 Json 是一个对象表示法,而不是它自己的对象。因此,从 HTTP 的角度来看,您只需向服务器发送一个字符串。服务器虽然确实理解 Json,但它知道如果您发送内容类型为 JSON 的请求,那么请求中的字符串可以从 JSON 序列化为对象。
  • 顺便说一句,如果您计划支持旧版浏览器,那么我会recommend using the json2 library
  • @Liam 你可以将普通的 javavscript 对象发送到服务器,只是服务器无法将其转换为 json 并生成结构。您可以通过`new StreamReader(context.Request.InputStream).ReadToEnd()` 阅读内容,您会看到类似id=1&amp;name=33 的内容。 (我不是说你应该,只是说你可以)
【解决方案2】:

您的 SaveItems 方法需要一个 ItemsList 对象,而在请求中发送的是一个字符串。您需要将请求数据反序列化到您的 ItemsList 对象中,如下所示:

public virtual JsonResult SaveItems(String jsonRequest)
{
    ItemsList items = Util.JsonSerializer.Deserialize<ItemsList>(jsonRequest);

    // further processing of items
}

【讨论】:

  • @lordkain 不是默认值。您应该添加对System.Web.Extensions.dll 的引用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-17
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多