Ich erhalte eine Fehlermeldung bei einem Ajax-Aufruf von jQuery.
Hier ist meine jQuery-Funktion:
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");
}
});
}
und das ist mein 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";
}
Kann mir bitte jemand sagen, was in meinem Code falsch ist?
Ich erhalte diesen Fehler:
{
"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"
}
Antworten:
Nur eine Vermutung, was die Variable danach
json
enthältWenn es sich um ein gültiges JSON-Objekt handelt,
{'foo':'foovalue', 'bar':'barvalue'}
sendet jQuery es möglicherweise nicht als JSON-Daten, sondern serialisiert es,foor=foovalue&bar=barvalue
um den Fehler zu erhalten"Invalid JSON primitive: foo"
Versuchen Sie stattdessen, die Daten als Zeichenfolge festzulegen
Auf diese Weise sollte jQuery die Daten in Ruhe lassen und die Zeichenfolge unverändert an den Server senden, damit ASP.NET die json-Serverseite analysieren kann.
quelle
{"foo": "foovalue", "bar": "barvalue"}
. Die Verwendung von einfachen Anführungszeichen ist ein Syntaxfehler.Verwenden von
in der oben genannten Situation hätte es meiner Meinung nach funktioniert.
Hinweis: Sie sollten die Bibliothek json2.js hinzufügen. Alle Browser unterstützen dieses JSON-Objekt nicht (IE7-). Unterschied zwischen json.js und json2.js
quelle
data: { JSON.stringify(obj) }
zudata: JSON.stringify(obj)
(Meine zu serialisierende Javascript / JSON-Klasse hat den Stilvar myObj = { title: "x", subclass = someVar, ... }
)contentType
formularcodierten Daten zu entfernen und jQuery weiterzuleiten.Wie durch Jitter festgestellt,
$.ajax
serialisiert die Funktion jedes Objekt / Array, das alsdata
Parameter verwendet wird, in ein URL-codiertes Format. Seltsamerweise gilt derdataType
Parameter nur für die Antwort vom Server - und nicht für Daten in der Anforderung.Nachdem ich auf dasselbe Problem gestoßen war, habe ich das jquery-json-Plugin heruntergeladen und verwendet , um die Anforderungsdaten korrekt in den ScriptService zu codieren. Verwenden Sie dann die
$.toJSON
Funktion, um die gewünschten Argumente zu codieren, die an den Server gesendet werden sollen:quelle
data
Parameter vom Aufruf ignoriert wird.data: { JSON.stringify(obj) }
es hatdata: JSON.stringify(obj)
sich für mich geändert, wenn Ihre Javascript-Klassevar myObj = { title: "x", subclass = someVar, ... }
dank des Punkts über die Datencodierung den Stil hat .es funktioniert so etwas
quelle
Jquery Ajax sendet die Daten standardmäßig als Abfragezeichenfolgenparameter wie folgt:
es sei denn, die
processData
Option ist auf false gesetzt. In diesem Fall wird sie als Objekt an den Server gesendet.contentType
Option ist für den Server, in welchem Format der Client die Daten gesendet hat.dataType
Die Option gilt für den Server, der angibt, welche Art von Datenclient vom Server zurück erwartet.ODER
quelle
Ich denke, @jitter hatte Recht mit seiner Vermutung, aber seine Lösung hat bei mir nicht funktioniert.
Folgendes hat funktioniert:
Ich habe es nicht versucht, aber ich denke, wenn der Parameter eine Zeichenfolge ist, sollte es so sein:
quelle
Ich hatte das gleiche Problem. Was ich mit einer guten Lösung gefunden habe, ist wie folgt:
Versuche dies...
Bitte beachten Sie hier für den String-Typ-Parameter, dass ich (\ ') Escape-Sequenz-Zeichen verwendet habe, um ihn als String-Wert zu kennzeichnen.
quelle
Wenn Sie JSON manuell formatieren, gibt es hier einen sehr praktischen Validator: jsonlint.com
Verwenden Sie doppelte Anführungszeichen anstelle von einfachen Anführungszeichen:
Ungültig:
Gültig:
quelle
Auf dem Server können Sie json für benutzerdefinierte Objekte serialisieren / deserialisieren:
quelle
Ich hatte das gleiche Problem. Ich habe die übergeordnete Seite "Speichern" aus dem Popup-Fenster "Schließen" aufgerufen. Es wurde festgestellt, dass ich
ClientIDMode="Static"
sowohl auf der übergeordneten als auch auf der Popup-Seite dieselbe Steuerelement-ID verwendet habe. Das EntfernenClientIDMode="Static"
von einer der Seiten löste das Problem.quelle
Hier ist dataTpe "json", daher muss data / reqParam beim Aufrufen der API die Form einer Zeichenfolge haben, viele so viele Objekte wie Sie möchten, aber schließlich innerhalb der Daten von $ .ajax das Objekt stringifizieren.
ODER,
quelle
Diese Antworten ließen mich nur zwischen ungültigem Parameter und fehlendem Parameter hin und her springen.
das hat bei mir funktioniert, nur String-Variablen in Anführungszeichen setzen ...
quelle