He recibido un "error de análisis" de jquery para una solicitud de Ajax, he intentado cambiar el POST a GET, devolviendo los datos de diferentes maneras (creando clases, etc.) pero parece que no puedo averiguar cuál es el problema.
Mi proyecto está en MVC3 y estoy usando jQuery 1.5. Tengo un menú desplegable y, en el evento de cambio, disparo una llamada para obtener algunos datos en función de lo que se seleccionó.
Menú desplegable: (esto carga las "Vistas" de la lista en Viewbag y la activación del evento funciona bien)
@{ 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"); } }); };
El código anterior llama con éxito al método MVC y devuelve:
[{"ViewContentID":1,"Name":"TopContent","Note":"Content on the top"}, {"ViewContentID":2,"Name":"BottomContent","Note":"Content on the bottom"}]
Pero jquery dispara el evento de error para el método $.ajax() diciendo "parsererror".
Recientemente me encontré con este problema y me topé con esta pregunta.
Lo resolví de una manera mucho más fácil.
Método uno
Puede eliminar la propiedad dataType: 'json'
del objeto literal...
Método dos
O puede hacer lo que decía @Sagiv devolviendo sus datos como Json
.
La razón por la que aparece este mensaje de error del parsererror
es que cuando simplemente devuelve una cadena u otro valor, no es realmente Json
, por lo que el analizador falla al analizarlo.
Entonces, si elimina la propiedad dataType: json
, no intentará analizarla como Json
.
Con el otro método, si se asegura de devolver sus datos como Json
, el analizador sabrá cómo manejarlos correctamente.
Consulte la respuesta de @david-east para conocer la forma correcta de manejar el problema.
Esta respuesta solo es relevante para un error con jQuery 1.5 cuando se usa el archivo: protocolo.
Recientemente tuve un problema similar al actualizar a jQuery 1.5. A pesar de obtener una respuesta correcta, el controlador de errores se disparó. Lo resolví usando el evento complete
y luego verificando el valor de estado. p.ej:
complete: function (xhr, status) { if (status === 'error' || !xhr.responseText) { handleError(); } else { var data = xhr.responseText; //... } }
Ha especificado el tipo de datos de respuesta de llamada ajax como:
'json'
donde la respuesta ajax real no es un JSON válido y, como resultado, el analizador JSON arroja un error.
El mejor enfoque que recomendaría es cambiar el tipo de datos a:
'texto'
y dentro de la devolución de llamada exitosa, valide si se devuelve un JSON válido o no, y si la validación de JSON falla, avise en la pantalla para que sea obvio con qué propósito está fallando realmente la llamada ajax. Echa un vistazo a esto:
$.ajax({ url: '/Admin/Ajax/GetViewContentNames', type: 'POST', dataType: 'text', data: {viewID: $("#view").val()}, success: function (data) { try { var output = JSON.parse(data); alert(output); } catch (e) { alert("Output is not valid JSON: " + data); } }, error: function (request, error) { alert("AJAX Call Error: " + error); } });