Я получаю сообщение об ошибке при вызове ajax из jQuery.
Вот моя функция jQuery:
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");
}
});
}
а это мой 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";
}
Кто-нибудь может сказать мне, что не так в моем коде?
Я получаю эту ошибку:
{
"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"
}
Ответы:
Просто угадайте, что
json
содержит переменная послеЕсли это действительный объект json, например,
{'foo':'foovalue', 'bar':'barvalue'}
jQuery может не отправлять его как данные json, а вместо этого сериализовать его, чтобыfoor=foovalue&bar=barvalue
вы получили ошибку"Invalid JSON primitive: foo"
Вместо этого попробуйте установить данные как строку
Таким образом, jQuery должен оставить данные в покое и отправить строку как есть на сервер, что должно позволить ASP.NET анализировать серверную часть json.
источник
{"foo": "foovalue", "bar": "barvalue"}
. Использование одинарных кавычек является синтаксической ошибкой.С помощью
Я считаю, что в вышеуказанной ситуации сработало бы.
Примечание. Вам следует добавить библиотеку json2.js, все браузеры не поддерживают этот объект JSON (IE7-). Разница между json.js и json2.js.
источник
data: { JSON.stringify(obj) }
наdata: JSON.stringify(obj)
(Мой класс javascript / JSON для сериализации соответствует стилюvar myObj = { title: "x", subclass = someVar, ... }
)contentType
и позволить jQuery передавать данные в кодировке формы.Как было отмечено джиттером,
$.ajax
функция сериализует любой объект / массив, используемый в качествеdata
параметра, в формат с кодировкой URL. Как ни странно, этотdataType
параметр применяется только к ответу сервера, а не к каким-либо данным в запросе.Столкнувшись с той же проблемой, я загрузил и использовал плагин jquery-json для правильного кодирования данных запроса в ScriptService. Затем использовал
$.toJSON
функцию для кодирования необходимых аргументов для отправки на сервер:источник
data
параметр игнорируется вызовом.data: { JSON.stringify(obj) }
наdata: JSON.stringify(obj)
сработало для меня, если ваш класс javascript соответствует стилюvar myObj = { title: "x", subclass = someVar, ... }
благодаря пункту о кодировке данных.это работает примерно так
источник
JQuery Ajax по умолчанию отправляет данные в виде параметров строки запроса, например:
если для
processData
параметра не установлено значение false, и в этом случае он будет отправлен как объект на сервер.contentType
Опция предназначена для сервера, в каком формате клиент отправил данные.dataType
Параметр предназначен для сервера, который сообщает, какой тип данных клиент ожидает от сервера.ИЛИ
источник
Думаю, @jitter был прав в своем предположении, но его решение не сработало для меня.
Вот что это сработало:
Я не пробовал, но думаю, что если параметр является строкой, он должен быть таким:
источник
Я столкнулся с той же проблемой, я пришел с хорошим решением, как показано ниже:
Попробуй это...
Обратите внимание, что здесь для параметра строкового типа я использовал символ escape-последовательности (\ ') для обозначения его как строкового значения.
источник
Если вы форматируете JSON вручную, здесь есть очень удобный валидатор: jsonlint.com
Используйте двойные кавычки вместо одинарных:
Недействительным:
Действителен:
источник
На сервере для сериализации / десериализации json в настраиваемые объекты:
источник
Я была такая же проблема. Я вызывал родительскую страницу «Сохранить» из всплывающего окна Close. Обнаружено, что я использовал
ClientIDMode="Static"
как родительскую, так и всплывающую страницу с одним и тем же идентификатором элемента управления. УдалениеClientIDMode="Static"
с одной из страниц решило проблему.источник
Здесь dataTpe - это "json", поэтому data / reqParam должен быть в форме строки при вызове API, столько же, сколько и объект, но, наконец, внутри данных $ .ajax преобразовать объект в строку.
ИЛИ,
источник
эти ответы заставили меня подпрыгивать между недопустимым параметром и отсутствующим параметром.
это сработало для меня, просто заключите строковые переменные в кавычки ...
источник