用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 "
使用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];
}