jQuery ajax get返回null

时间:2018-09-12 05:26:09

标签: jquery asp.net ajax

我正在使用此函数在Visual Studio 2010中填充表。但是成功函数返回null。在我的网络服务中,我正在使用

Context.Response.Write(js.Serialize(listMsg));

// THIS IS MY JAVA SCRIPT CODE   

    function getAllMessages() {
        $.ajax({
            url: "TestService.asmx/GetAllMessages",
            dataType: "json",
            method: "GET",
            contentType: "application/json",
            success: function (data) {
                var messageTable = $("#messages tbody");
                $(data).each(function (index, msg) {
                    var apnString = "<tr><td>" + msg.ID + "</td><td>" + msg.Email + "</td><td>" + msg.Message + "</td><td>" + msg.TimeStamp + "</td></tr>";
                    messageTable.append(apnString);
                });

            },
            error: function (err) {
                console.log(err);
            }
        });

}

这是我的webMethod代码。 Web服务正在返回json数据。

[System.Web.Script.Services.ScriptService]
    public class TestService : System.Web.Services.WebService
    {
        SQLHelper clSQLHelper = new SQLHelper();

        [WebMethod]
        public void GetAllMessages()
        {
            List<Messages> listMsg = new List<Messages>();
            DataTable dtMsg = clSQLHelper.PGSQLExecuteReader("get_all_messages", new List<NpgsqlParameter>(), "Messages");
            if (dtMsg != null && dtMsg.Rows.Count > 0)
            {

                foreach (DataRow dr in dtMsg.Rows)
                {
                    Messages Msg = new Messages();
                    Msg.ID = Convert.ToInt32(dr["auto_id"]);
                    Msg.Email = dr["email_id"].ToString();
                    Msg.Message = dr["message"].ToString();
                    Msg.TimeStamp = Convert.ToDateTime(dr["created_on"], new CultureInfo("en-IN"));
                    listMsg.Add(Msg);
                }

                JavaScriptSerializer js = new JavaScriptSerializer();
                Context.Response.Write(js.Serialize(listMsg));
            }
        }
    }

enter image description here

1 个答案:

答案 0 :(得分:0)

您提到的代码有两个问题-

1。在网络方法中,您使用的是以下行,因此您不会在ajax中向客户端调用返回任何内容。

  

Context.Response.Write(js.Serialize(listMsg));

因此,您需要更改方法的定义以返回字符串并返回响应,如下所示-

[WebMethod(Description = "Description")]
[System.Web.Script.Services.ScriptMethod(UseHttpGet = true, ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
        public string GetAllMessages()
        {
            List<Messages> listMsg = new List<Messages>();
            DataTable dtMsg = clSQLHelper.PGSQLExecuteReader("get_all_messages", new List<NpgsqlParameter>(), "Messages");
            if (dtMsg != null && dtMsg.Rows.Count > 0)
            {

                foreach (DataRow dr in dtMsg.Rows)
                {
                    Messages Msg = new Messages();
                    Msg.ID = Convert.ToInt32(dr["auto_id"]);
                    Msg.Email = dr["email_id"].ToString();
                    Msg.Email = dr["message"].ToString();
                    Msg.TimeStamp = Convert.ToDateTime(dr["created_on"], new CultureInfo("en-IN"));
                    listMsg.Add(Msg);
                }

            }
            JavaScriptSerializer js = new JavaScriptSerializer();
            return js.Serialize(listMsg);
        }

2。您没有告诉ASMX Web方法如何访问该方法

在asmx上调用GET方法时,您需要在网络方法顶部添加以下行

  

[System.Web.Script.Services.ScriptMethod(UseHttpGet = true,   ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]

上一行的重要性-

  

此属性用于为可以指定方法的信息指定信息   从客户端脚本调用。该属性使您可以指定哪个HTTP   动词(GET或POST)可用于调用方法。它还可以让您   指定是否使用JavaScript格式化响应   对象符号(JSON)或XML。

以下是其他属性的详细信息-

UseHttpGet

  

指定是否使用HTTP GET调用该方法   命令。默认值为false。

ResponseFormat

  

指定将响应序列化为JSON还是XML。   默认值为Json。 ResponseFormat属性可用于指定   该方法返回XmlDocument或   XmlElement对象。

请参考有关此的更多信息 https://docs.microsoft.com/en-us/dotnet/api/system.web.script.services.scriptmethodattribute?view=netframework-4.7.2