Saya mendapatkan kesalahan dalam panggilan ajax dari jQuery.
Inilah fungsi jQuery saya:
function DeleteItem(RecordId, UId, XmlName, ItemType, UserProfileId) {
var obj = {
RecordId: RecordId,
UserId: UId,
UserProfileId: UserProfileId,
ItemType: ItemType,
FileName: XmlName
};
var json = Sys.Serialization.JavaScriptSerializer.serialize(obj);
$.ajax({
type: "POST",
url: "EditUserProfile.aspx/DeleteRecord",
data: json,
contentType: "application/json; charset=utf-8",
dataType: "json",
async: true,
cache: false,
success: function(msg) {
if (msg.d != null) {
RefreshData(ItemType, msg.d);
}
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert("error occured during deleting");
}
});
}
dan ini milikku WebMethod
:
[WebMethod]
public static string DeleteRecord(Int64 RecordId, Int64 UserId, Int64 UserProfileId, string ItemType, string FileName) {
try {
string FilePath = HttpContext.Current.Server.MapPath(FileName);
XDocument xmldoc = XDocument.Load(FilePath);
XElement Xelm = xmldoc.Element("UserProfile");
XElement parentElement = Xelm.XPathSelectElement(ItemType + "/Fields");
(from BO in parentElement.Descendants("Record")
where BO.Element("Id").Attribute("value").Value == RecordId.ToString()
select BO).Remove();
XDocument xdoc = XDocument.Parse(Xelm.ToString(), LoadOptions.PreserveWhitespace);
xdoc.Save(FilePath);
UserInfoHandler obj = new UserInfoHandler();
return obj.GetHTML(UserId, UserProfileId, FileName, ItemType, RecordId, Xelm).ToString();
} catch (Exception ex) {
HandleException.LogError(ex, "EditUserProfile.aspx", "DeleteRecord");
}
return "success";
}
Adakah yang bisa memberi tahu saya apa yang salah dalam kode saya?
Saya mendapatkan kesalahan ini:
{
"Message":"Invalid JSON primitive: RecordId.",
"StackTrace":"
at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()
at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)
at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)
at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)
at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)",
"ExceptionType":"System.ArgumentException"
}
Jawaban:
Coba tebak isi variabel
json
setelahnyaJika itu adalah objek json yang valid seperti
{'foo':'foovalue', 'bar':'barvalue'}
maka jQuery mungkin tidak mengirimnya sebagai data json tetapi sebagai gantinya membuat serialfoor=foovalue&bar=barvalue
sehingga Anda mendapatkan kesalahan"Invalid JSON primitive: foo"
Coba atur data sebagai string
Dengan cara ini jQuery harus membiarkan datanya sendiri dan mengirim string apa adanya ke server yang memungkinkan ASP.NET untuk mengurai sisi server json.
sumber
{"foo": "foovalue", "bar": "barvalue"}
. Menggunakan tanda kutip tunggal adalah kesalahan sintaksis.Menggunakan
dalam situasi di atas akan berhasil saya percaya.
Catatan: Anda harus menambahkan pustaka json2.js semua browser tidak mendukung objek JSON (IE7-) Perbedaan antara json.js dan json2.js
sumber
data: { JSON.stringify(obj) }
menjadidata: JSON.stringify(obj)
(kelas javascript / JSON saya menjadi serial adalah gayavar myObj = { title: "x", subclass = someVar, ... }
)contentType
dan membiarkan jQuery meneruskan data yang dikodekan formulir.Seperti dicatat oleh jitter,
$.ajax
fungsi tersebut membuat serial objek / larik apa pun yang digunakan sebagaidata
parameter ke dalam format yang dikodekan url. Anehnya,dataType
parameter hanya berlaku untuk respons dari server - dan tidak untuk data apa pun dalam permintaan.Setelah mengalami masalah yang sama, saya mengunduh dan menggunakan plugin jquery-json untuk menyandikan data permintaan dengan benar ke ScriptService. Kemudian, gunakan
$.toJSON
fungsi untuk mengenkode argumen yang diinginkan untuk dikirim ke server:sumber
data
parameter diabaikan oleh panggilan tersebut.data: { JSON.stringify(obj) }
menjadidata: JSON.stringify(obj)
berhasil untuk saya jika kelas javascript Anda bergayavar myObj = { title: "x", subclass = someVar, ... }
berkat poin tentang pengkodean data.itu bekerja seperti ini
sumber
Jquery Ajax secara default akan mengirimkan data sebagai parameter string kueri berbentuk seperti:
kecuali jika
processData
opsi disetel ke false, dalam hal ini akan dikirim sebagai objek ke server.contentType
opsi untuk server yang format klien telah mengirim data.dataType
Opsi adalah untuk server yang memberi tahu bahwa jenis data apa yang diharapkan klien dari server.ATAU
sumber
Sepertinya @jitter benar dalam tebakannya, tetapi solusinya tidak berhasil untuk saya.
Inilah yang berhasil:
Saya belum mencoba tetapi saya pikir jika parametter adalah string, seharusnya seperti ini:
sumber
Saya menghadapi masalah yang sama, apa yang saya dapatkan dengan solusi yang baik adalah sebagai berikut:
Coba ini...
Harap dicatat di sini untuk parameter tipe string saya telah menggunakan (\ ') karakter urutan melarikan diri untuk menunjukkannya sebagai nilai string.
sumber
Jika memformat JSON secara manual, ada validator yang sangat berguna di sini: jsonlint.com
Gunakan tanda kutip ganda, bukan tanda kutip tunggal:
Tidak valid:
Sah:
sumber
Di Server, untuk membuat serial / deserialisasi json ke objek kustom:
sumber
Saya memiliki masalah yang sama. Saya menelepon halaman induk "Simpan" dari jendela Popup Tutup. Menemukan bahwa saya menggunakan
ClientIDMode="Static"
pada halaman induk dan popup dengan ID kontrol yang sama. MenghapusClientIDMode="Static"
dari salah satu halaman menyelesaikan masalah.sumber
Di sini dataTpe adalah "json" jadi, data / reqParam harus dalam bentuk string saat memanggil API, sebanyak objek yang Anda inginkan tetapi akhirnya di dalam data $ .ajax merangkai objek tersebut.
ATAU,
sumber
jawaban ini hanya membuat saya bolak-balik antara parameter yang tidak valid dan parameter yang hilang.
ini berhasil untuk saya, cukup bungkus variabel string dalam tanda kutip ...
sumber