Je reçois une erreur dans un appel ajax de jQuery.
Voici ma fonction 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");
}
});
}
et voici mon 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";
}
Quelqu'un peut-il me dire ce qui ne va pas dans mon code?
J'obtiens cette erreur:
{
"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"
}
Réponses:
Juste une idée de ce que contient la variable
json
aprèsS'il s'agit d'un objet json valide comme
{'foo':'foovalue', 'bar':'barvalue'}
jQuery, il se peut que jQuery ne l'envoie pas en tant que données json mais le sérialise à la place pourfoor=foovalue&bar=barvalue
obtenir l'erreur"Invalid JSON primitive: foo"
Essayez plutôt de définir les données sous forme de chaîne
De cette façon, jQuery doit laisser les données seules et envoyer la chaîne telle quelle au serveur, ce qui doit permettre à ASP.NET d'analyser le côté serveur json.
la source
{"foo": "foovalue", "bar": "barvalue"}
. L'utilisation de guillemets simples est une erreur de syntaxe.En utilisant
dans la situation ci-dessus aurait fonctionné, je crois.
Remarque: vous devez ajouter la bibliothèque json2.js. Tous les navigateurs ne prennent pas en charge cet objet JSON (IE7-) Différence entre json.js et json2.js
la source
data: { JSON.stringify(obj) }
pourdata: JSON.stringify(obj)
(Ma classe javascript / JSON à sérialiser est du stylevar myObj = { title: "x", subclass = someVar, ... }
)contentType
et de laisser jQuery transmettre les données codées par formulaire.Comme indiqué par la gigue, la
$.ajax
fonction sérialise tout objet / tableau utilisé commedata
paramètre dans un format encodé en URL. Curieusement, ledataType
paramètre s'applique uniquement à la réponse du serveur - et non aux données de la requête.Après avoir rencontré le même problème, j'ai téléchargé et utilisé le plugin jquery-json pour encoder correctement les données de la demande dans ScriptService. Ensuite, utilisé la
$.toJSON
fonction pour encoder les arguments souhaités à envoyer au serveur:la source
data
paramètre est ignoré par l'appel.data: { JSON.stringify(obj) }
en adata: JSON.stringify(obj)
fonctionné pour moi si votre classe javascript est du stylevar myObj = { title: "x", subclass = someVar, ... }
grâce au point sur l'encodage des données.ça marche quelque chose comme ça
la source
Jquery Ajax enverra par défaut les données sous forme de paramètres de chaîne de requête comme:
sauf si l'
processData
option est définie sur false, auquel cas elle sera envoyée comme objet au serveur.contentType
L'option est pour le serveur dans quel format le client a envoyé les données.dataType
L'option est pour le serveur qui indique quel type de données le client attend en retour du serveur.OU
la source
Je suppose que @jitter avait raison dans sa supposition, mais sa solution n'a pas fonctionné pour moi.
Voici ce que cela a fonctionné:
Je n'ai pas essayé mais je pense que si le paramètre est une chaîne, cela devrait ressembler à ceci:
la source
J'étais confronté au même problème, ce que je suis venu avec une bonne solution est comme ci-dessous:
Essaye ça...
Veuillez noter ici que pour le paramètre de type de chaîne, j'ai utilisé le caractère de séquence d'échappement (\ ') pour le désigner comme valeur de chaîne.
la source
Si vous formatez manuellement JSON, il existe un validateur très pratique ici: jsonlint.com
Utilisez des guillemets doubles au lieu de guillemets simples:
Invalide:
Valide:
la source
Sur le serveur, pour sérialiser / désérialiser json en objets personnalisés:
la source
J'ai eu le même problème. J'appelais la page parent "Enregistrer" à partir de la fenêtre contextuelle Fermer. J'ai trouvé que j'utilisais
ClientIDMode="Static"
à la fois sur la page parent et la page contextuelle avec le même ID de contrôle. La suppressionClientIDMode="Static"
de l'une des pages a résolu le problème.la source
Ici, dataTpe est "json" donc, data / reqParam doit être sous la forme d'une chaîne lors de l'appel de l'API, autant d'objet que vous le souhaitez, mais enfin dans les données de $ .ajax stringify l'objet.
OU,
la source
ces réponses m'ont juste fait rebondir entre un paramètre invalide et un paramètre manquant.
cela a fonctionné pour moi, enveloppez simplement les variables de chaîne entre guillemets ...
la source