отправка JSON возражают успешно против asp.net WebMethod, использование jQuery

В моем случае проблема заключалась в том, что я вручную удалил некомпиляционный файл, который был помечен как «отсутствующий». Однажды я удалил ссылку на отсутствующий файл и перекомпилировал - все было хорошо.

20
задан Cœur 15 January 2017 в 14:44
поделиться

5 ответов

При использовании 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);
        }
    }
}
9
ответ дан 29 November 2019 в 22:46
поделиться

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

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

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

3
ответ дан 29 November 2019 в 22:46
поделиться

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

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» (как было предложено кем-то другим). Он автоматически сделает это за вас на основе указанных типов параметров вашего метода. Если вы обнаружите, что делаете это, значит, вы делаете это неправильно.

46
ответ дан 29 November 2019 в 22:46
поделиться
1
ответ дан 29 November 2019 в 22:46
поделиться

Ниже приведен фрагмент кода из нашего проекта - у меня были проблемы с тем, что я не обернул объект как строку, а также со значениями 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)
    {
5
ответ дан 29 November 2019 в 22:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: