Recibo un error en una llamada ajax de jQuery.
Aquí está mi función 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");
}
});
}
y este es mi 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";
}
¿Alguien puede decirme qué está mal en mi código?
Recibo este error:
{
"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"
}
Respuestas:
Solo una adivina qué contiene la variable
json
despuésSi es un objeto json válido,
{'foo':'foovalue', 'bar':'barvalue'}
entonces jQuery podría no enviarlo como datos json, sino serializarlo parafoor=foovalue&bar=barvalue
obtener el error"Invalid JSON primitive: foo"
En su lugar, intente configurar los datos como una cadena
De esta manera, jQuery debería dejar los datos en paz y enviar la cadena como está al servidor, lo que debería permitir que ASP.NET analice el lado del servidor json.
fuente
{"foo": "foovalue", "bar": "barvalue"}
. El uso de comillas simples es un error de sintaxis.Utilizando
en la situación anterior habría funcionado, creo.
Nota: Debe agregar la biblioteca json2.js, todos los navegadores no admiten ese objeto JSON (IE7-) Diferencia entre json.js y json2.js
fuente
data: { JSON.stringify(obj) }
adata: JSON.stringify(obj)
(Mi clase javascript / JSON para serializar es del estilovar myObj = { title: "x", subclass = someVar, ... }
)contentType
y dejar que jQuery pase los datos codificados por formulario.Como indica jitter, la
$.ajax
función serializa cualquier objeto / matriz utilizado comodata
parámetro en un formato codificado en URL. Curiosamente, eldataType
parámetro solo se aplica a la respuesta del servidor, y no a los datos de la solicitud.Después de encontrar el mismo problema, descargué y usé el complemento jquery-json para codificar correctamente los datos de la solicitud en ScriptService. Luego, usó la
$.toJSON
función para codificar los argumentos deseados para enviarlos al servidor:fuente
data
parámetro es ignorado por la llamada.data: { JSON.stringify(obj) }
adata: JSON.stringify(obj)
funcionó para mí si su clase de javascript es del estilovar myObj = { title: "x", subclass = someVar, ... }
gracias al punto sobre la codificación de datos.está funcionando algo como esto
fuente
Jquery Ajax enviará los datos de forma predeterminada como parámetros de cadena de consulta como:
a menos que la
processData
opción esté establecida en false, en cuyo caso se enviará como objeto al servidor.contentType
La opción es para el servidor en qué formato el cliente ha enviado los datos.dataType
La opción es para el servidor que indica qué tipo de datos del cliente espera recibir del servidor.O
fuente
Supongo que @jitter tenía razón en su suposición, pero su solución no funcionó para mí.
Esto es lo que funcionó:
No lo he intentado, pero creo que si el parámetro es una cadena, debería ser así:
fuente
Estaba enfrentando el mismo problema, lo que obtuve con una buena solución es la siguiente:
Prueba esto...
Tenga en cuenta que aquí para el parámetro de tipo de cadena he utilizado (\ ') carácter de secuencia de escape para denotarlo como valor de cadena.
fuente
Si formatea manualmente JSON, hay un validador muy útil aquí: jsonlint.com
Utilice comillas dobles en lugar de comillas simples:
Inválido:
Válido:
fuente
En el servidor, para serializar / deserializar json en objetos personalizados:
fuente
Tuve el mismo problema. Estaba llamando a la página principal "Guardar" desde la ventana emergente Cerrar. Descubrí que estaba usando
ClientIDMode="Static"
tanto en la página principal como en la página emergente con la misma identificación de control. EliminarClientIDMode="Static"
de una de las páginas resolvió el problema.fuente
Aquí dataTpe es "json" entonces, data / reqParam debe estar en forma de cadena mientras se llama a la API, tanto como objeto como desee, pero por fin dentro de los datos de $ .ajax, cadena el objeto.
O,
fuente
estas respuestas me hicieron rebotar entre el parámetro no válido y el parámetro faltante.
esto funcionó para mí, simplemente envuelva las variables de cadena entre comillas ...
fuente