успешная отправка объекта JSON в asp.net WebMethod с использованием jQuery - PullRequest
20 голосов
/ 18 июля 2009

Я работал над этим 3 часа и сдался. Я просто пытаюсь отправить данные в веб-метод asp.net, используя jQuery. Данные в основном представляют собой пару пар ключ / значение. поэтому я попытался создать массив и добавить пары в этот массив.

Мой WebMethod (aspx.cs) выглядит следующим образом (это может быть неправильно для того, что я создаю в javascript, я просто не знаю):

   [WebMethod]
    public static string SaveRecord(List<object> items)
    .....

Вот мой пример JavaScript:

var items = new Array;

    var data1 = { compId: "1", formId: "531" };
    var data2 = { compId: "2", formId: "77" };
    var data3 = { compId: "3", formId: "99" };
    var data4 = { status: "2", statusId: "8" };
    var data5 = { name: "Value", value: "myValue" };

    items[0] = data1;
    items[1] = data2;
    items[2] = data3;
    items[3] = data4;
    items[4] = data5;
Here is my jQuery ajax call:

var options = {
        error: function(msg) {
            alert(msg.d);
        },
        type: "POST",
        url: "PackageList.aspx/SaveRecord",
        data: { 'items': items },
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: false,
        success: function(response) {
            var results = response.d;
        }
    };
    jQuery.ajax(options);

я получаю ошибку - Invalid JSON primitive: items. -

так что ... если я сделаю это:

var DTO = {'items': items};

и установите параметр данных следующим образом:

данные: JSON.stringify (DTO)

тогда я получаю эту ошибку:

Cannot convert object of type \u0027System.String\u0027 to type \u0027System.Collections.Generic.List`1[System.Object]\u0027

Ответы [ 6 ]

46 голосов
/ 22 июля 2009

В вашем примере это должно работать, если ваш параметр данных:

data: "{'items':" + JSON.stringify(items) + "}"

Помните, что вам нужно отправить строку JSON в ASP.NET AJAX. Если вы указали фактический объект JSON в качестве параметра данных jQuery, он вместо этого будет сериализовать его в виде пар & k = v? K = v.

Похоже, вы уже это прочитали, но посмотрите на мой пример использования JavaScript DTO с jQuery, JSON.stringify и ASP.NET AJAX . Он охватывает все, что вам нужно для этой работы.

Примечание. Никогда не следует использовать JavaScriptSerializer для десериализации JSON вручную в «ScriptService» (как это было предложено кем-то другим). Он автоматически сделает это за вас, основываясь на указанных типах параметров вашего метода. Если вы обнаружите, что делаете это, вы делаете это неправильно.

9 голосов
/ 19 июля 2009

При использовании AJAX.NET я всегда делаю входной параметр простым старым объектом, а затем использую десериализатор javascript, чтобы преобразовать его в любой тип, который я хочу. По крайней мере, таким образом вы можете отлаживать и видеть, к какому типу объектов относится веб-метод.

Вам необходимо преобразовать ваш объект в строку при использовании jQuery

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="sm" runat="server" EnablePageMethods="true">
            <Scripts>
                <asp:ScriptReference Path="~/js/jquery.js" />
            </Scripts>
        </asp:ScriptManager>
        <div></div>
    </form>
</body>
</html>
<script type="text/javascript" language="javascript">
    var items = [{ compId: "1", formId: "531" },
        { compId: "2", formId: "77" },
        { compId: "3", formId: "99" },
        { status: "2", statusId: "8" },
        { name: "Value", value: "myValue"}];

        //Using Ajax.Net Method
        PageMethods.SubmitItems(items,
            function(response) { var results = response.d; },
            function(msg) { alert(msg.d) },
            null);

        //using jQuery ajax Method
        var options = { error: function(msg) { alert(msg.d); },
                        type: "POST", url: "WebForm1.aspx/SubmitItems",
                        data: {"items":items.toString()}, // array to string fixes it *
                        contentType: "application/json; charset=utf-8",
                        dataType: "json",
                        async: false, 
                        success: function(response) { var results = response.d; } }; 
        jQuery.ajax(options);
</script>

И код позади

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Script.Serialization;
using System.Web.Script.Services;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomEquip
{
    [ScriptService]
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        [WebMethod]
        public static void SubmitItems(object items)
        {
            //break point here
            List<object> lstItems = new JavaScriptSerializer().ConvertToType<List<object>>(items);
        }
    }
}
5 голосов
/ 01 июля 2010

Ниже приведен фрагмент кода из нашего проекта - у меня возникли проблемы с переносом объекта как строки, а также со значениями Date - надеюсь, это кому-нибудь поможет:

        // our JSON data has to be a STRING - need to send a JSON string to ASP.NET AJAX. 
        // if we specify an actual JSON object as jQuery's data parameter, it will serialize it as ?k=v&k=v pairs instead
        // we must also wrap the object we are sending with the name of the parameter on the server side – in this case, "invoiceLine"
        var jsonString = "{\"invoiceLine\":" + JSON.stringify(selectedInvoiceLine) + "}";

        // reformat the Date values so they are deserialized properly by ASP.NET JSON Deserializer            
        jsonString = jsonString.replace(/\/Date\((-?[0-9]+)\)\//g, "\\/Date($1)\\/");

        $.ajax({
            type: "POST",
            url: "InvoiceDetails.aspx/SaveInvoiceLineItem",
            data: jsonString,
            contentType: "application/json; charset=utf-8",
            dataType: "json"
        });

Подпись метода сервера выглядит следующим образом:

    [WebMethod]
    public static void SaveInvoiceLineItem(InvoiceLineBO invoiceLine)
    {
3 голосов
/ 18 июля 2009

Украсьте свой [WebMethod] другим атрибутом:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

Я считаю, что это в System.Web.Services.Scripting ...

1 голос
/ 12 апреля 2013

Это способ определения ваших данных (JSON)

data: { 'items': items },

а это так и должно быть

data: '{ items: " '+items +' "}',

В основном вы сериализуете параметр.

1 голос
/ 28 декабря 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...