【问题标题】:Generate a json string in a Ajax WebMethod and send it back to the aspx在 Ajax WebMethod 中生成一个 json 字符串并将其发送回 aspx
【发布时间】:2015-02-07 17:10:30
【问题描述】:

我正在尝试在 Ajax WebMethod 中生成一个 json 字符串并将其发送回 aspx 成功结果并打印输出结果。 json2 字符串不正确。有什么建议?

默认.aspx.cs

    [System.Web.Services.WebMethod]
    public static string GetJSONdata(string id)
    {
        string json2 = "";
        string val = "1;2;3;4;5";
        string[] arr = val.Split(';');
        string connStr = ConfigurationManager.ConnectionStrings["jsonobject"].ConnectionString;
        string cmdStr = "SELECT ([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", id);
                    using (SqlDataReader rdr = cmd.ExecuteReader())
                    {
                        if (rdr.Read())
                        {
                            arr[1] = rdr[1].ToString();
                            arr[2] = rdr[2].ToString();
                            arr[3] = rdr[3].ToString();
                            arr[4] = rdr[4].ToString();
                        }
                    }
                    conn.Close();
                    cmd.Dispose();
                    conn.Dispose();
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        json2 = "{'datajson' : [{'id' : '" + id + "', 'datetime' : '" + arr[1] + "', 'col1' : '" + arr[2] + "', 'col2' : '" + arr[3] + "', 'col3' : '" + arr[4] + "'}]}";
        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.datajson[0].id);
                    $("#<%= TextBox3.ClientID %>").val(result.datajson[0].datetime);
                    $("#<%= TextBox4.ClientID %>").val(result.datajson[0].col1);
                    $("#<%= TextBox5.ClientID %>").val(result.datajson[0].col2);
                    $("#<%= TextBox6.ClientID %>").val(result.datajson[0].col3);
                },
                error: function (Msg) {
                    $("#<%= Label1.ClientID %>").text('failed:' + Msg.status +  '    response:' + Msg.responseText);

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

错误代码:

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

【问题讨论】:

  • 请不要这样构建 JSON。有很多方法可以正确地做到这一点 - 特别是 JSON.NET 中的 JsonConvert.Serialize - 您只需构建一个对象,它就会正确序列化。像这样拼凑一个字符串会给你带来各种各样的麻烦。

标签: c# jquery asp.net ajax


【解决方案1】:
  1. post 键必须匹配
  2. 不要对数据进行字符串化
  3. 使用库构建 JSON 不要手动进行(请参阅@joe 评论)

ajax:

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "Default.aspx/GetJSONdata",
    data: {clientId : id },
    success: function (result) {...},
    error: function (Msg) {...}
});

C#:

[System.Web.Services.WebMethod]
public static string GetJSONdata(string clientId){...}

构建 JSON:

使用库,JSON.NET 是一个很好的库。它的工作方式,你创建一个模型:

public class Datajson
{
    public string id { get; set; }
    public string datetime { get; set; }
    public string col1 { get; set; }
    public string col2 { get; set; }
    public string col3 { get; set; }
}

然后用它来构建你的字符串

List<Datajson> data = new List<Datajson>();
Datajson json = new Datajson();
json.id = clientId;
json.datetime = rdr[1].ToString();
json.col1 = rdr[2].ToString();
json.col2 = rdr[3].ToString();
json.col3 = rdr[4].ToString();
data.add(json);

var jsonString = JsonConvert.SerializeObject(data);

然后登录查看。

【讨论】:

    【解决方案2】:

    只是猜测...
    但是当您在 ajax 请求中发送“ID”时,您期望 GetJSONdata 中有“id”。可能希望两者保持一致

    【讨论】:

      猜你喜欢
      • 2011-08-18
      • 2016-08-03
      • 2013-01-15
      • 2019-03-18
      • 1970-01-01
      • 2011-07-10
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多