Tenho recebido um "parsererror" de jquery para um pedido Ajax, tenho tentado mudar o POST para um GET, devolvendo os dados de algumas maneiras diferentes (criando classes, etc.) mas não consigo perceber qual é o problema.
O meu projecto está em MVC3 e I'm usando jQuery 1.5 Tenho um Dropdown e no evento de troca disparo uma chamada para obter alguns dados com base no que foi seleccionado.
Dropdown: (isto carrega o "Views" da lista no Viewbag e disparar o evento funciona bem)
@{
var viewHtmls = new Dictionary<string, object>();
viewHtmls.Add("data-bind", "value: ViewID");
viewHtmls.Add("onchange", "javascript:PageModel.LoadViewContentNames()");
}
@Html.DropDownList("view", (List<SelectListItem>)ViewBag.Views, viewHtmls)
Javascript:
this.LoadViewContentNames = function () {
$.ajax({
url: '/Admin/Ajax/GetViewContentNames',
type: 'POST',
dataType: 'json',
data: { viewID: $("#view").val() },
success: function (data) {
alert(data);
},
error: function (data) {
debugger;
alert("Error");
}
});
};
O código acima referido chama com sucesso o método MVC e retorna:
[{"ViewContentID":1,"Name":"TopContent","Note":"Content on the top"},
{"ViewContentID":2,"Name":"BottomContent","Note":"Content on the bottom"}]
Mas jquery dispara o evento de erro para o método $.ajax() dizendo "parsererror".
Deparei-me recentemente com este problema e deparei-me com esta questão.
Resolvi-o de uma forma muito mais fácil.
**Método Um***
Pode remover o dataType: 'json'
propriedade do objecto literalmente...
**Método Dois***
Ou pode fazer o que @Sagiv estava a dizer devolvendo os seus dados como Json
.
A razão pela qual esta mensagem de "parsererror" ocorre é que quando simplesmente se devolve um fio ou outro valor, não é realmente "son", por isso o parser falha quando o analisamos.
Assim, se remover a propriedade dataType: json
, não tentará analisá-la como Json
.
Com o outro método, se se certificar de devolver os seus dados como Json
, o analisador saberá como tratá-los correctamente.
**Veja a resposta por @david-east para a forma correcta de tratar o assunto***
Esta resposta só é relevante para um bug com jQuery 1.5 quando se utiliza o ficheiro: protocol.
Tive um problema semelhante recentemente ao actualizar para jQuery 1.5. Apesar de ter obtido uma resposta correcta, o manipulador de erros disparou. Resolvi-o utilizando o evento `completo' e depois verificando o valor do estado. e.g:
complete: function (xhr, status) {
if (status === 'error' || !xhr.responseText) {
handleError();
}
else {
var data = xhr.responseText;
//...
}
}
o problema é que o seu controlador devolve um fio ou outro objecto que pode't ser analisado. a chamada ajax esperada para receber Json em troca. tente devolver JsonResult no controlador dessa forma:
public JsonResult YourAction()
{
...return Json(YourReturnObject);
}
espero que ajude :)