Otrzymuję błąd w wywołaniu Ajax z jQuery.
Oto moja funkcja 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");
}
});
}
a to jest moje 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";
}
Czy ktoś może mi powiedzieć, co jest nie tak w moim kodzie?
Otrzymuję ten błąd:
{
"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"
}
Odpowiedzi:
Zgadnij, co zawiera zmienna
json
poJeśli jest to prawidłowy obiekt json, taki jak
{'foo':'foovalue', 'bar':'barvalue'}
jQuery, może nie wysłać go jako danych json, ale zamiast tego serializować go, abyfoor=foovalue&bar=barvalue
uzyskać błąd"Invalid JSON primitive: foo"
Spróbuj zamiast tego ustawić dane jako ciąg
W ten sposób jQuery powinno pozostawić dane w spokoju i wysłać ciąg bez zmian do serwera, co powinno pozwolić ASP.NET na przeanalizowanie strony serwera json.
źródło
{"foo": "foovalue", "bar": "barvalue"}
. Używanie apostrofów jest błędem składniowym.Za pomocą
wierzę, że w powyższej sytuacji zadziałałoby.
Uwaga: należy dodać bibliotekę json2.js, wszystkie przeglądarki nie obsługują tego obiektu JSON (IE7-). Różnica między json.js i json2.js
źródło
data: { JSON.stringify(obj) }
nadata: JSON.stringify(obj)
(Moja klasa javascript / JSON do serializacji jest w styluvar myObj = { title: "x", subclass = someVar, ... }
)contentType
i pozwolić jQuery przekazać dane zakodowane w formularzu.Jak zauważono przez jitter,
$.ajax
funkcja serializuje dowolny obiekt / tablicę używaną jakodata
parametr do formatu zakodowanego w postaci adresu URL. Co dziwne, plikdataType
parametr dotyczy tylko odpowiedzi z serwera - a nie żadnych danych w żądaniu.Po napotkaniu tego samego problemu pobrałem i użyłem pobrałem wtyczki jquery-json do poprawnego zakodowania danych żądania do usługi ScriptService. Następnie użyliśmy
$.toJSON
funkcji do zakodowania żądanych argumentów do wysłania na serwer:źródło
data
parametr jest ignorowany przez wywołanie.data: { JSON.stringify(obj) }
nadata: JSON.stringify(obj)
zadziałała dla mnie, jeśli twoja klasa javascript jest w styluvar myObj = { title: "x", subclass = someVar, ... }
dzięki punktowi o kodowaniu danych.działa coś takiego
źródło
Jquery Ajax domyślnie wyśle dane jako parametry ciągu zapytania w postaci:
chyba że
processData
opcja jest ustawiona na false, w takim przypadku zostanie wysłana jako obiekt do serwera.contentType
opcja dotyczy serwera, w którym klient wysłał dane w formacie.dataType
opcja jest przeznaczona dla serwera, który informuje, jakiego typu dane klient oczekuje z powrotem z serwera.LUB
źródło
Przypuszczam, że @jitter miał rację, ale jego rozwiązanie nie działało dla mnie.
Oto, co zadziałało:
Nie próbowałem, ale myślę, że jeśli parametr jest ciągiem, powinien wyglądać tak:
źródło
Miałem do czynienia z tym samym problemem, co otrzymałem z dobrym rozwiązaniem, jak poniżej:
Spróbuj tego...
Proszę zauważyć, że w przypadku parametru typu łańcuchowego użyłem (\ ') znaku sekwencji ucieczki do oznaczenia go jako wartość ciągu.
źródło
W przypadku ręcznego formatowania JSON jest tutaj bardzo przydatny walidator: jsonlint.com
Użyj podwójnych cudzysłowów zamiast pojedynczych cudzysłowów:
Nieważny:
Ważny:
źródło
Na serwerze, aby serializować / deserializować json do obiektów niestandardowych:
źródło
Miałem ten sam problem. Dzwoniłem do strony nadrzędnej „Zapisz” z wyskakującego okienka Zamknij. Odkryłem, że używam
ClientIDMode="Static"
zarówno strony nadrzędnej, jak i wyskakującej z tym samym identyfikatorem kontroli. UsunięcieClientIDMode="Static"
z jednej ze stron rozwiązało problem.źródło
Tutaj dataTpe to "json", więc data / reqParam musi być w postaci łańcucha podczas wywoływania API, tyle że ile chcesz, ale w końcu wewnątrz danych $ .ajax stringify obiektu.
LUB,
źródło
te odpowiedzi sprawiły, że odbijałem się od nieprawidłowego parametru i brakującego parametru.
to zadziałało dla mnie, po prostu zawiń zmienne łańcuchowe w cudzysłowy ...
źródło