Estou recebendo um erro em uma chamada ajax do jQuery.
Aqui está minha função 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");
}
});
}
e este é o meu 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";
}
Alguém pode me dizer o que há de errado no meu código?
Estou recebendo este erro:
{
"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"
}
Respostas:
Adivinhe o que a variável
json
contém depoisSe for um objeto json válido como o
{'foo':'foovalue', 'bar':'barvalue'}
jQuery pode não enviá-lo como dados json, mas sim serializá-lo parafoor=foovalue&bar=barvalue
obter o erro"Invalid JSON primitive: foo"
Em vez disso, tente definir os dados como string
Desta forma, o jQuery deve deixar os dados sozinhos e enviar a string como está para o servidor, o que deve permitir que o ASP.NET analise o lado do servidor json.
fonte
{"foo": "foovalue", "bar": "barvalue"}
. Usar aspas simples é um erro de sintaxe.Usando
na situação acima teria funcionado, eu acredito.
Observação: você deve adicionar a biblioteca json2.js, todos os navegadores não suportam esse objeto JSON (IE7-). Diferença entre json.js e json2.js
fonte
data: { JSON.stringify(obj) }
adata: JSON.stringify(obj)
(My javascript / JSON classe para serialize é do estilovar myObj = { title: "x", subclass = someVar, ... }
)contentType
e deixar o jQuery passar os dados codificados pelo formulário.Conforme observado pelo jitter, a
$.ajax
função serializa qualquer objeto / array usado como odata
parâmetro em um formato codificado por url. Curiosamente, odataType
parâmetro só se aplica à resposta do servidor - e não a quaisquer dados na solicitação.Depois de encontrar o mesmo problema, baixei e usei o plugin jquery-json para codificar corretamente os dados da solicitação para o ScriptService. Em seguida, use a
$.toJSON
função para codificar os argumentos desejados para enviar ao servidor:fonte
data
parâmetro é ignorado pela chamada.data: { JSON.stringify(obj) }
paradata: JSON.stringify(obj)
funcionou para mim se a sua classe javascript é do estilovar myObj = { title: "x", subclass = someVar, ... }
graças ao ponto sobre a codificação de dados.está funcionando algo assim
fonte
O Jquery Ajax enviará por padrão os dados como parâmetros de string de consulta como:
a menos que a
processData
opção seja definida como falsa, caso em que será enviada como objeto ao servidor.contentType
a opção é para o servidor em que formato o cliente enviou os dados.dataType
opção é para o servidor que informa que tipo de cliente de dados está esperando de volta do servidor.OU
fonte
Acho que @jitter estava certo em seu palpite, mas sua solução não funcionou para mim.
Aqui está o que funcionou:
Eu não tentei, mas acho que se o parâmetro é uma string, deveria ser assim:
fonte
Eu estava enfrentando o mesmo problema, o que eu vim com uma boa solução é o seguinte:
Experimente isso ...
Observe aqui para o parâmetro de tipo de string que usei (\ ') o caractere de sequência de escape para denotá-lo como um valor de string.
fonte
Se você formatar JSON manualmente, há um validador muito útil aqui: jsonlint.com
Use aspas duplas em vez de aspas simples:
Inválido:
Válido:
fonte
No servidor, para serializar / desserializar json para objetos personalizados:
fonte
Eu tive o mesmo problema. Eu estava chamando a página principal de "Salvar" em Fechar a janela pop-up. Descobri que estava usando
ClientIDMode="Static"
na página pai e na página pop-up com a mesma id de controle. RemoverClientIDMode="Static"
de uma das páginas resolveu o problema.fonte
Aqui, dataTpe é "json", portanto, data / reqParam deve estar na forma de string ao chamar a API, tanto quanto o objeto que você quiser, mas, finalmente, dentro dos dados de $ .ajax, string o objeto.
OU,
fonte
essas respostas apenas me fizeram saltar para frente e para trás entre o parâmetro inválido e o parâmetro ausente.
isso funcionou para mim, basta envolver as variáveis de string entre aspas ...
fonte