在对 WebMethod 的 jQuery AJAX 调用中获取空响应,但 Web 方法返回 JSON

Posted

技术标签:

【中文标题】在对 WebMethod 的 jQuery AJAX 调用中获取空响应,但 Web 方法返回 JSON【英文标题】:Getting null Response in an jQuery AJAX call to a WebMethod but Web Method returns JSON 【发布时间】:2018-07-13 06:13:48 【问题描述】:

我收到一个 jQuery AJAX 调用的空/未定义响应。我正在尝试将数据绑定到 asp.net webforms 中的 Jquery 数据表。当我尝试解析数据时,它在 JSON 中的位置 1 Error 处给了我一个 Unexpected token o。我怀疑问题可能出在 JSON 数据上,但我已经在 J​​SONlint.com 验证了 json 输出。 一定是我犯了一些愚蠢的错误,但我无法弄清楚,我已经浪费了数小时来排除故障。

jQuery Ajax 调用

<script type="text/javascript">
    $(function () 
        $('#ShowData').click(function () 
            $.ajax(
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: 'Default.aspx/fetchDetails',
                dataType: 'json',                    
                data: "'JobID':'" + $('#txtJobID').val() + "'",
                success: function (response) 
                    //var d = JSON.parse(data);
                    var data = response.d;
                    alert(typeof (data)); //gives out object
                    alert(response.d); //gives out null
                    $('#tblBasicInfo').dataTable(
                        paging: false,
                        data: data,
                        columns: [
                             'data': 'JobId' ,
                             'data': 'UserId' ,
                             'data': 'UserName' ,
                             'data': 'Cas' ,
                             'data': 'Question' ,                                
                             'data': 'Language' ,
                             'data': 'Appl' ,
                        ]
                    );
                ,
                error: function (xhr, ajaxoptions, thrownError) 
                    alert(xhr.responseText);
                    console.log(xhr.responseText);
                    console.log(xhr.responseJSON);
                
            );
        );
    );
</script>

网络方法

 [System.Web.Services.WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public static void fetchDetails(string JobID)
    
        var conn = System.Configuration.ConfigurationManager.ConnectionStrings["Connection"];
        SqlConnection con = new SqlConnection(conn.ToString());

        String query = "Select TOP 1 * FROM TAble where Jobid =@JobID";
        DataTable dtBasicInfo = new DataTable();
        SqlCommand a = new SqlCommand(query, con);
        a.Parameters.AddWithValue("@JobID", Int32.Parse(JobID));
        con.Open();
        SqlDataAdapter da = new SqlDataAdapter(a);
        da.Fill(dtBasicInfo);
        SqlDataReader value = a.ExecuteReader();
        con.Close();
        JavaScriptSerializer js = new JavaScriptSerializer();

        JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
        List<Dictionary<string, object>> parentRow = new List<Dictionary<string, object>>();
        Dictionary<string, object> childRow;
        foreach (DataRow row in dtBasicInfo.Rows)
        
            childRow = new Dictionary<string, object>();
            foreach (DataColumn col in dtBasicInfo.Columns)
            
                childRow.Add(col.ColumnName, row[col]);
            
            parentRow.Add(childRow);
        
        var jsk = jsSerializer.Serialize(parentRow);
    

JSON

["JobId":123456789,"UserId":"asdf3a     ","UserName":"Pekki, Barb                      ","Cas":263,"Question":"Q12345","Language":"ENG","Appl":300]

【问题讨论】:

我已经发布了答案。您正在以错误的方式执行 Web 方法。在处理网络方法时,您需要记住一些简单的点,我在回答中已经提到过。 【参考方案1】:

只需确保在您的代码中实现了以下几点,然后它就可以正常工作。调用数据表 API 时使用大写 D,如 $('#tblBasicInfo').DataTable(

    您的问题是您从 WebMethod 中返回了 void。 您需要从 Web 方法 fetchDetails 返回一个 C# 对象。 您不需要在 WebMethod,因为 ASP.Net 框架将为您完成这项工作;只是 从您的 C# 代码返回一个有效的对象,它会正常工作。 另外,删除您刚才提到的数据类型标志 fetchDetails 方法,因为它不需要。我已经删除了所有 来自您的 fetchDetails 方法的序列化代码,因为它不需要。 只需从您的 Web 方法返回一个类的 C# 对象。

因此,在您的情况下,在您的方法 fetchDetails 中定义此类的实例。

职位类别

public class Job 

  public int JobId get;set;
  public string UserId get;set;
  public string UserName get;set;
  public int Cas get;set;
  public string Question get;set;
  public string Language get;set;
  public int  Appl get;set;


fetchDetails 方法返回作业类型

[System.Web.Services.WebMethod]
 public static Job fetchDetails(string JobID)

    var conn = System.Configuration.ConfigurationManager.ConnectionStrings["Connection"];
    SqlConnection con = new SqlConnection(conn.ToString());

    String query = "Select TOP 1 * FROM TAble where Jobid =@JobID";
    DataTable dtBasicInfo = new DataTable();
    SqlCommand a = new SqlCommand(query, con);
    a.Parameters.AddWithValue("@JobID", Int32.Parse(JobID));
    con.Open();
    SqlDataAdapter da = new SqlDataAdapter(a);
    da.Fill(dtBasicInfo);
    SqlDataReader value = a.ExecuteReader();
    con.Close();

    //WRITE CODE to populate a Job object
     Job job = new Job();
    //set properties of job object before returning it as in code below
   If (dtBasicInfo. Rows. Count > 0)
    
    job.JobId =  Int32.Parse(JobID);
    job.UserId = dtBasicInfo.Rows[0]["UserId"].toString();
    job.UserName = dtBasicInfo.Rows[0]["UserName"].toString();
    

   return job;

【讨论】:

我已经进行了更改,但数据表仍然填充 0 条记录 :( 如何提醒(response.d);现在给我对象 Object 而不是类型 null 但数据表没有加载任何记录。 这是一个不同的问题,与返回 null 的 webmethod 无关。您必须确保数据库中的表有记录。另外,您的代码中不需要数据读取器,因为您正在获取 DataTable。 Response.d 将是一个 Javascript 对象,这是正确的。你期望它是什么? 数据库有记录,我从数据库中获取数据,response.d 应该是 javascript 对象,但我不明白为什么当一切似乎都到位时绑定没有发生。请你看看我的ajax代码。我是新手,怀疑我错过了什么

以上是关于在对 WebMethod 的 jQuery AJAX 调用中获取空响应,但 Web 方法返回 JSON的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 自定义验证器 + WebMethod + jQuery

JQuery ajax调用asp.net的webMethod

对 .NET WebMethod 的 jQuery 调用无序运行

与 jquery 对 webmethod 的调用一致地获得“401 Unauthorized”错误

通过 jQuery AJAX 将字符串数组传递给 C# WebMethod

如何使用 AJAX (jquery) 将嵌套的对象数组传递和接收到 c# WebMethod 中?