【问题标题】:Ajax call to [WebMethod] throws an exception对 [WebMethod] 的 Ajax 调用引发异常
【发布时间】:2014-12-10 12:46:31
【问题描述】:

我正在尝试将 SQL Server 数据作为 JSON 发送回。在 Button1 按下时,ID 会从 JSON 形式的 Ajax Post 传递给 [WebMethod]

jsonobject 调用 jsondb.mdf,它存在于表中:jsondata 和列 idd, datetime, col1, col2col3,其中包含数据。

默认.aspx.cs

    [System.Web.Services.WebMethod]
    public static string GetJSONdata(string id1)
    {
        DataSet ds = new DataSet();
        DataTable dt = new DataTable();
        string connStr = ConfigurationManager.ConnectionStrings["jsonobject"].ConnectionString;
        string cmdStr = "SELECT ([idd],[datetime],[col1],[col2],[col3]) FROM [jsondata] WHERE [idd]=@idd;";
        try
        {
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                using (SqlCommand cmd = new SqlCommand(cmdStr, conn))
                {
                    conn.Open();
                    cmd.Parameters.AddWithValue("@idd", id1);
                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        da.Fill(ds);
                        dt = ds.Tables[0];
                    }
                }
            }
        }
        catch (Exception ex)
        {
        }

        System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();

        List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
        Dictionary<string, object> row;

        foreach (DataRow dr in dt.Rows)
        {
            row = new Dictionary<string, object>();

            foreach (DataColumn col in dt.Columns)
            {
                row.Add(col.ColumnName, dr[col]);
            }

            rows.Add(row);
        }

        var json2 = serializer.Serialize(rows);
        return json2;
    }

默认.aspx

<script type="text/javascript" src="~/Scripts/jquery-1.4.1.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script type="text/javascript">
    $(document).ready(function () {
        $("#<%= Button1.ClientID %>").click(function () {
            var id = $("#<%= TextBox1.ClientID %>").val();
            var data = { ID:id };
            var json1 = JSON.stringify(data);
            $.ajax({
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: "Default.aspx/GetJSONdata",
                data: json1,
                dataType: "json",
                success: function (result) {
                    $("#<%= TextBox2.ClientID %>").val(result.ID);
                    $("#<%= TextBox3.ClientID %>").val(result.datetime);
                    $("#<%= TextBox4.ClientID %>").val(result.col1);
                    $("#<%= TextBox5.ClientID %>").val(result.col2);
                    $("#<%= TextBox6.ClientID %>").val(result.col3);
                },
                error: function (Msg) {
                    $("#<%= Label1.ClientID %>").text('failed:' + Msg.status +  '    response:' + Msg.responseText);

                }
            }); return false;
        });
    });

错误代码:

失败:500 响应:{“消息”:“无效的 Web 服务调用,缺少参数值:\u0027id1\u0027。”,“StackTrace”:“在 System.Web.Script.Services.WebServiceMethodData.CallMethod(Object目标,IDictionary2 parameters)\r\n at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary2 个参数)\r\n 在 System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext 上下文,WebServiceMethodData 方法数据,IDictionary`2 rawParams)\r\n 在 System.Web.Script.Services。 RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}

【问题讨论】:

  • 您的 Web 服务方法中的参数名为 id1,但您的 JSON 对象有一个名为 ID 的属性。名称需要匹配。
  • 我不确定。但是您可以尝试将GetJSONdata(string id1) 更改为GetJSONdata(string id)
  • 您的 Web 方法参数称为 id1,但在您的 JS 中,您传递了一个名为 ID 的参数。他们需要匹配。

标签: c# asp.net ajax asp.net-ajax


【解决方案1】:
 type: "POST",
                    async: false,
                    url: "Default.aspx/GetJSONdata",
                    data: "{id1:id}",// Change Name As Per You WEBMETHOD 
                    contentType: "application/json; charset=utf-8",
                    datatype: "json",

//做这个改变可能会帮助你

1) 创建类

public class ABC
        {
            public string idd{ get; set; }
            public string datetime{ get; set; }
            public string col1{ get; set; }
            public string col2{ get; set; }
            public string col3{ get; set; }

        }

2)创建网络方法

  [webmethod]
  public static ABC[] GetJSONdata(string id1)
        {
            MasterLogic ml = new MasterLogic();
             DataSet ds = new DataSet();
    DataTable dt = new DataTable();
    string connStr = ConfigurationManager.ConnectionStrings["jsonobject"].ConnectionString;
    string cmdStr = "SELECT ([idd],[datetime],[col1],[col2],[col3]) FROM [jsondata] WHERE [idd]=@idd;";
    try
    {
        using (SqlConnection conn = new SqlConnection(connStr))
        {
            using (SqlCommand cmd = new SqlCommand(cmdStr, conn))
            {
                conn.Open();
                cmd.Parameters.AddWithValue("@idd", id1);
                using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                {
                    da.Fill(ds);
                    dt = ds.Tables[0];
                }
            }
        }
    }
    catch (Exception ex)
    {
    }
            List<ABC> ProjectStatus = new List<ABC>();
            foreach (DataRow dr in dt.Rows)
            {
                ABC ps = new ABC();
              ps.id=Convert.ToInt32(dr["Columnname"]);
             // Do same To set value OF Properties
                ProjectStatus.Add(ps);

            }
            return ProjectStatus.ToArray();
        }

//获取ASPX页面上的Json

success: function (response) {
     for (var i = 0; i < response.d.length; i++) {
     //Write Your logic
    }
}

【讨论】:

  • 请解释您的帖子如何回答问题,或者为什么它应该有效。而不是像以前一样抛出同样的错误
  • 您必须传递在您的 Web 方法中定义的具有相同名称的参数
  • 请解释在你的回答中为什么这应该有效(它不会)。实际上,您正在将字符串 id 传递给名为 id1 的参数,而不是按照 OP 的意图传递控件的 ID
  • 我进行了所有更改,没有错误,但所有输出都为空。我认为这意味着序列化不起作用。
  • 我只是根据您的新错误编辑我的答案,所以请查看可能对您有帮助的代码...
猜你喜欢
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 2021-01-05
相关资源
最近更新 更多