2

我正在我的 JavaScript 中创建一个 JSON 字符串并将其发送到我在 mvc 应用程序中的控制器。我创建 JSON 字符串的代码:

     $('#btnassign').click(function () {

            var arrPrice = "";
            var arrMarkUP = "";

            $("table tr").each(function () {

                if ($(this).find('input:checkbox:first').is(':checked')) {

                    if ($(this).find('input.inputprice').val() != "") {
                        arrPrice += "{";
                        var price = $(this).find('input.inputprice').val();
                        var id = $(this).find('input[type=hidden]').val();
                        arrPrice += '"Id":"' + id + '","Price":"' + price + '"';
                        arrPrice += "},";
                    }
                    if ($(this).find('input.inputmarkup').val() != "") {
                        arrMarkUP += "{";
                        var price = $(this).find('input.inputmarkup').val();
                        var id = $(this).find('input[type=hidden]').val();
                        arrMarkUP += "Id:" + id + ",Price:" + price;
                        arrMarkUP += "},";
                    }
                }
            });

            var lastindexp = arrPrice.lastIndexOf(",");
            arrPrice = arrPrice.substring(0, lastindexp) + "|";
            var lastindexm = arrMarkUP.lastIndexOf(",");
            arrMarkUP = arrMarkUP.substring(0, lastindexm) + "|";
            alert(arrPrice);
            alert(arrMarkUP);

            $("#hdPrice").val(arrPrice);
            $("#hdMarkUP").val(arrMarkUP);

            $("#AssignProductForm").submit();
        });

    });

我的 JSON 字符串从上面的代码生成:

    {"Id":"1","Price":"4"},{"Id":"2","Price":"6"}

我的控制器解析代码:

    [HttpPost]
    public ActionResult AddProducts(FormCollection collection, string txtsearch)
    {
        var ManualPricing = collection["hdPrice"].Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);

         JavaScriptSerializer ser = new JavaScriptSerializer();
         var Manual = ser.Deserialize<PriceMargin>(ManualPricing[0]);         
    }

价格保证金是一个应该反序列化的类:

    public class PriceMargin
    {
        public string Id { get; set; }
        public string Price { get; set; }
    }

var Manual = ser.Deserialize<PriceMargin>(ManualPricing[0])给了我一个错误:

无效的 JSON 原语:{"Id":"2","Price":"9"}。

解决方案:

var list = new JavaScriptSerializer().Deserialize<List<KeyValue>>(json);

public class KeyValue
{
   public string key;
   public string value;
}
4

3 回答 3

1

您的 JSON 无效。

JSON 只能有一个根对象。

如果要拥有多个对象,请序列化一个数组。

于 2013-07-07T16:34:25.437 回答
1

要跟进评论,如果您想要一个对象数组,您可以执行以下操作:

pricesArray = [];
$("table tr").each(function () {
  if ($(this).find('input:checkbox:first').is(':checked')) {
    var price = $(this).find('input.inputprice').val();
    var id = $(this).find('input[type=hidden]').val();
    pricesArray.push({Id : id, Price: price});
  }
});
// pricesArray [{"Id":"1","Price":"4"},{"Id":"2","Price":"6"}]

pricesArray现在应该包含您想要的数据,应该更容易序列化和反序列化您的数据并立即发送

于 2013-07-07T16:39:56.347 回答
0

上次遇到该错误时,我尝试将对象值直接传递给 json 数据...即

data = { datavalue: @Object.valueField};

在 JSON 中

$.ajax({
    type: "POST",
    url: "/Controller/FunctionToPostTo",
    data: data,
    contentType: "application/json; charset=utf-8",
    dataType: "html",
    success: function (response) {
        alert('Success');
    },
    failure: function (response) {
        alert('Failure');
        alert(response.responseText);
    },
    error: function (response) {
        alert('Error');
        alert(response.responseText);
    }
});

为了解决这个问题,我创建了一个单独的变量并为其赋值,在 Ajax 中传递数据值我使用了 JSON.stringify 函数

var variableHolder = @Object.valueField;
data = { datavalue: variableHolder };

在 JSON 中

$.ajax({
    type: "POST",
    url: "/Controller/FunctionToPostTo",
    data: JSON.stringify(data),
    contentType: "application/json; charset=utf-8",
    dataType: "html",
    success: function (response) {
        alert('Success');
    },
    failure: function (response) {
        alert('Failure');
        alert(response.responseText);
    },
    error: function (response) {
        alert('Error');
        alert(response.responseText);
    }
});

然后问题就消失了

于 2017-05-10T07:20:27.030 回答