用json/ajax发送给webmethod的字符串

本文关键字:webmethod 字符串 json ajax | 更新日期: 2023-09-27 18:14:46

我有一个ajax调用从aspx页面发送一些数据到webmethod (c#),其中一个发送的参数是一些自由文本注释。现在我注意到一些错误和更新没有得到数据库。所以经过一些检查,我相信是斜杠和s以及其他字符造成的。我尝试使用escape()方法,它的工作原理,但随后添加各种编码文本到数据库,我不想要的。我不是一个经验丰富的编码器,所以我知道有某种编码在这里做,但我不确定。这是下面的ajax,直到我得到斜杠和

$("#btnEditFields").click(function () {
    //Store the New comment
    var strSupplierOrderNo = $("#<%=tbPopUpEditSuppOrdNo.ClientID%>").val();
    var strComment = $("#<%=tbPopUpEditComments.ClientID%>").val();
    var strCurrentStage = $("#<%=ddlPopUpEditCurrentStage.ClientID%>").val();
    var strReviewDate = $("#<%=tbPopUpEditReviewDate.ClientID%>").val();
    var strOrderDate = $("#<%=tbPopUpEditOrderDate.ClientID%>").val();
    var strRequiredLive = $("#<%=tbPopUpEditRequiredLiveDate.ClientID%>").val();
    var strActualAppointmentDate = $("#<%=tbPopUpEditActualAppointmentDate.ClientID%>").val();
    var strOtherRef = $("#<%=tbPopUpFieldOtherRef.ClientID%>").val();
    var EditRecordArgs = (strServiceID + "," + strSupplierOrderNo + "," + strComment + "," + strCurrentStage + "," + strReviewDate + "," + strOrderDate + "," + strRequiredLive + "," + strActualAppointmentDate + "," + strOtherRef);
    //alert(addNewCommentArgs);
    // Confirming the operation from the user
    if (confirm("You are about to add a new comment to order " + strPSTNNum + "?")) {
        $.ajax({
            type: "POST",
            //UpdateRecordInGridViewUsingAjax.aspx is the page name and UpdateOrder 
            // is the server side web method which actually does the updation
            url: "PSTN_OrderManagementTracker.aspx/updatePSTNDataInDB",
            //Passing the record id and data to be updated which is in the variable update_data
            data: "{'args': '" + EditRecordArgs + "'}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            //Giving message to user on successful updation
            success: function () {
                alert("Comment successfully added!!!");
                location.reload(); 
            },
            error: function(xhr, ajaxOptions, thrownError){
            alert(thrownError);
        }
        });
    }
    return false;
});
});

这是web方法:

[System.Web.Services.WebMethod]
public static void updatePSTNDataInDB(string args)
{
    string[] data = args.Trim().Split(',');
    string strServiceID = data[0];
    string strSupplierOrderNo = data[1];
    string strComment = data[2];
    string strCurrentStage = data[3];
    string strReviewDate = data[4];
    string strOrderDate = data[5];
    string strRequiredLive = data[6];
    string strActualAppointmentDate = data[7];            
    string strOtherRef = data[8];            
    #region Check for and existing PSTNReport Record and create one if not, then run the update to the database.
    SqlConnection seConnection1 = new SqlConnection();
    seConnection1.ConnectionString = Databases.getDbConnectionString("csSingleEnded2");
    seConnection1.Open();
    SqlCommand seCmd1 = new SqlCommand("CheckForPSTNReportRecord", seConnection1);
    seCmd1.CommandType = CommandType.StoredProcedure;
    seCmd1.Parameters.Add(new SqlParameter("@ServiceID", SqlDbType.Int));
    seCmd1.Parameters["@ServiceID"].Value = strServiceID;
    SqlDataAdapter dbAdapter1 = new SqlDataAdapter(seCmd1);
    DataSet dbSeDataset1 = new DataSet();
    dbAdapter1.Fill(dbSeDataset1);
    if (dbSeDataset1.Tables[0].Rows.Count == 0)
    {
        SqlCommand seCmd2 = new SqlCommand("AddAPSTNReportRecord", seConnection1);
        //specify that the command is a sproc and not just SQL text
        seCmd2.CommandType = CommandType.StoredProcedure;
        //Create the parameters
        seCmd2.Parameters.Add(new SqlParameter("@ServiceID", SqlDbType.Int));
        seCmd2.Parameters["@ServiceID"].Value = strServiceID;
        SqlDataAdapter dbAdapter2 = new SqlDataAdapter(seCmd2);
        DataSet dbSeDataset2 = new DataSet();
        dbAdapter2.Fill(dbSeDataset2);
        seConnection1.Close();
    }
    SqlConnection seConnection = new SqlConnection();
    seConnection.ConnectionString = Databases.getDbConnectionString("csSingleEnded2");
    seConnection.Open();
    SqlCommand seCmd = new SqlCommand("UpdatePstnOrdersComments", seConnection);
    seCmd.CommandType = CommandType.StoredProcedure;
    seCmd.Parameters.Add(new SqlParameter("@ServiceID", SqlDbType.Int));
    seCmd.Parameters.Add(new SqlParameter("@SupplierOrderNumber", SqlDbType.NVarChar,50));
    seCmd.Parameters.Add(new SqlParameter("@Comments", SqlDbType.NVarChar,4000));
    seCmd.Parameters.Add(new SqlParameter("@OrderDate", SqlDbType.DateTime));
    seCmd.Parameters.Add(new SqlParameter("@RequiredLiveDate", SqlDbType.DateTime));
    seCmd.Parameters.Add(new SqlParameter("@AppointmentDate", SqlDbType.DateTime));
    seCmd.Parameters.Add(new SqlParameter("@ReviewDate", SqlDbType.DateTime));
    seCmd.Parameters.Add(new SqlParameter("@CurrentStage", SqlDbType.NVarChar,500));
    seCmd.Parameters.Add(new SqlParameter("@OtherRef", SqlDbType.NVarChar, 500));
    seCmd.Parameters["@ServiceID"].Value = strServiceID;
    seCmd.Parameters["@SupplierOrderNumber"].Value = strSupplierOrderNo;
    seCmd.Parameters["@Comments"].Value = strComment ;
    seCmd.Parameters["@OrderDate"].Value = strOrderDate;
    seCmd.Parameters["@RequiredLiveDate"].Value = strRequiredLive;
    seCmd.Parameters["@AppointmentDate"].Value = strActualAppointmentDate;
    seCmd.Parameters["@ReviewDate"].Value = strReviewDate;
    seCmd.Parameters["@CurrentStage"].Value = strCurrentStage;
    seCmd.Parameters["@OtherRef"].Value = strOtherRef;
    SqlDataAdapter dbAdapter = new SqlDataAdapter(seCmd);
    DataSet dbSeDataset = new DataSet();
    dbAdapter.Fill(dbSeDataset);
    seConnection.Close();
}

只是为了完成,当我试图在单词中间添加撇号时,我已经从firebug中添加了一个错误:

"传入的无效对象,':'或'}'是预期的。(50):{"参数":158581年,aaa5 - 5 - 23264304431, aaaaaCustom怎样% 20仍然% 20不% 20准备% 20 % 20民事% 20工作% 20 % 20仍然% 20 % 20没有% 20目前完成了% 20% 26% 20 % 20仍% 20 % 20还% 27 t % 20 % 20任何% 20管/有线电视/dp % 20安装% 2 c % 20 % 20确认% 20 % 20 % 20站点% 20接触% 20史蒂夫·威廉姆斯% 20 % 20 % 20是谁% 20知道% 20的% 20这% 20也约会。% 20 % 20 % 20引用% 20 dp % 20 % 20将% 20 % 20错误% 20 dp % 20 % 20 % 20的% 20地址% 20 % 20 dp % 20是一个% 20 ext % % 20 u2019l % 20块2015% % % 20 20闭目% 20街% 20 20% - 26% % 20总理% 20客栈% 20 % 20 a % 20 b兰德% 20新% 20酒店% 20只% 20 % 20 completed. % 0 a % 20也% 20响了% 20 % 20项目% 20团队% 20 % 20通知% 20他们% 20 % 20 % 20的% 20原因% 20 % 20 delay. % 0 a % 0 asmcyb07 % 2027/09/2012 % 2014% 3 a50 % 3 a00 % 0 a,民事,22/05/2013,22/05/2013 22/05/2013,22/05/2013 aaaa级"}"StackTrace " at "System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary (Int32深度)System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal (Int32深度)System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(字符串输入,Int32深度限制,JavaScriptSerializer序列化器)在System.Web.Script.Serialization.JavaScriptSerializer.Deserialize (JavaScriptSerializer序列化器,字符串输入,类型类型,Int32深度限制)atSystem.Web.Script.Serialization.JavaScriptSerializer.Deserialize [T](字符串输入)System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest (HttpContext上下文,JavaScriptSerializer序列化器)System.Web.Script.Services.RestHandler.GetRawParams (WebServiceMethodData方法数据,HttpContext上下文)System.Web.Script.Services.RestHandler.ExecuteWebServiceCall (HttpContextcontext, WebServiceMethodDataExceptionType"系统。ArgumentException "

用json/ajax发送给webmethod的字符串

使用System.Net.WebUtility.HtmlDecode()解码注释。

seCmd.Parameters["@Comments"].Value = System.Net.WebUtility.HtmlDecode(strComment);

您可以在客户端使用encodeURI(http://www.w3schools.com/jsref/jsref_encodeuri.asp)或encodeuriccomponent (http://www.w3schools.com/jsref/jsref_encodeuricomponent.asp),在服务器端使用Url.Unescape(http://msdn.microsoft.com/en-us/library/system.uri.unescape.aspx)。

,而不是data: "{'args': '" + EditRecordArgs + "'}",我认为最好使用

data: "{'arg1': '" + arg1Value + "', arg2': '"+ arg2Value ...+" }"

避免Trim出现问题

我建议不要用逗号分隔json对象来传递值。这样会更清晰,你可以更容易地传递值。

创建一个JS类
EditRecordArgs = {};
EditRecordArgs.ServiceID = '“' + strServiceID+ '”'; 
EditRecordArgs.SupplierNo = '“' + strSupplierOrderNo + '”'; 
EditRecordArgs.Comment = '“' + strComment + '”'; 

.

.

用c#创建一个类

Public ServiceRecord
{
public string  ServiceID{get; set;}
public string  SupplierNo{get; set;}
public string  Comment{get; set;}
}

In a class

使用名称空间
using System.Web.Script.Serialization;

web方法

ServiceRecord r = ser.Deserialize<ServiceRecord>(args); 

使用JSON字符串向服务器发送数据,并从服务器反序列化数据。

$("#btnEditFields").click(function () {
        //Store the New comment
       var data = {};
    data.strSupplierOrderNo =$("#<%=tbPopUpEditSuppOrdNo.ClientID%>").val();
    data.strComment =$("#<%=tbPopUpEditComments.ClientID%>").val();;
    .
    .
    .
    ...
        // Confirming the operation from the user
        if (confirm("You are about to add a new comment to order " + strPSTNNum + "?")) {
            $.ajax({
                type: "POST",
                //UpdateRecordInGridViewUsingAjax.aspx is the page name and UpdateOrder 
                // is the server side web method which actually does the updation
                url: "PSTN_OrderManagementTracker.aspx/updatePSTNDataInDB",
                //Passing the record id and data to be updated which is in the variable update_data
                data: {args: JSON.stringify(data)},
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                //Giving message to user on successful updation
                success: function () {
                    alert("Comment successfully added!!!");
                    location.reload(); 
                },
                error: function(xhr, ajaxOptions, thrownError){
                alert(thrownError);
            }
            });
        }
        return false;
    });
    });

背后的代码
[System.Web.Services.WebMethod]
public static void updatePSTNDataInDB(string args)
{
  var serializer = new JavaScriptSerializer();
  Dictionary<string, string> jsonObjects = serializer.Deserialize<Dictionary<string, string>>(args);
  strSupplierOrderNo =  jsonObjects[strSupplierOrderNo];
}