Al obtener un "parsererror" de jquery para una solicitud de Ajax, he intentado cambiar la POST a una GET, devolviendo los datos de diferentes maneras (creando clases, etc.) pero parece que no puedo entender cuál es el problema.
Mi proyecto está en MVC3 y estoy usando jQuery 1.5. Tengo un menú desplegable y, en el evento onchange, disparo una llamada para obtener algunos datos basados en lo que se seleccionó.
Menú desplegable: (esto carga las "Vistas" de la lista en el Viewbag y disparar el 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 () que dice "parsererror".
Respuestas:
Recientemente encontré este problema y me topé con esta pregunta.
Lo resolví de una manera mucho más fácil.
Método uno
Puede eliminar la
dataType: 'json'
propiedad del objeto literal ...Método dos
O puede hacer lo que @Sagiv estaba diciendo devolviendo sus datos como
Json
.La razón por la
parsererror
que aparece este mensaje es que cuando simplemente devuelve una cadena u otro valor, en realidad no lo esJson
, por lo que el analizador falla al analizarlo.Por lo tanto, si elimina la
dataType: json
propiedad, no intentará analizarla comoJson
.Con el otro método, si se asegura de devolver sus datos como
Json
, el analizador sabrá cómo manejarlos correctamente.fuente
dataType
!Vea 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.
Tuve un problema similar recientemente cuando actualicé a jQuery 1.5. A pesar de obtener una respuesta correcta, se activó el controlador de errores. Lo resolví usando el
complete
evento y luego verificando el valor del estado. p.ej:fuente
{}
. Es una pena que esto sea necesario....The JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. As of jQuery 1.9, an empty response is also rejected; the server should return a response of null or {} instead.
api.jquery.com/jQuery.ajaxHa especificado la respuesta de llamada AJAX tipo de datos como:
donde, como la respuesta real de ajax no es un JSON válido y, como resultado, el analizador JSON arroja un error.
El mejor enfoque que yo recomendaría es cambiar el tipo de datos a:
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, alertarlo en la pantalla para que sea obvio para qué propósito la llamada ajax realmente falla. Echa un vistazo a esto:
fuente
El problema es que su controlador devuelve una cadena u otro objeto que no se puede analizar. la llamada ajax esperaba obtener a Json a cambio. intente devolver JsonResult en el controlador así:
Espero eso ayude :)
fuente
Sus datos JSON pueden estar equivocados. http://jsonformatter.curiousconcept.com/ para validarlo.
fuente
Hay muchas sugerencias para eliminar
Si bien reconozco que esto funciona, ignora el problema subyacente. Si está seguro de que la cadena de retorno realmente es JSON, busque espacios en blanco errantes al comienzo de la respuesta. Considera echarle un vistazo en Fiddler. El mío se veía así:
En mi caso, se trataba de un problema con PHP que arrojaba caracteres no deseados (en este caso, BOM de archivos UTF). Una vez que los eliminé, solucionó el problema mientras mantenía
fuente
Asegúrese de eliminar cualquier código de depuración o cualquier otra cosa que pueda generar información no deseada. Algo obvio, pero fácil de olvidar en el momento.
fuente
No sé si esto todavía es real, pero el problema fue con la codificación. Cambiar a ANSI resolvió el problema para mí.
fuente
Si tiene este problema usando HTTP GET en IE, resolví este problema configurando el caché: falso. Como utilicé la misma URL para las solicitudes HTML y json, llegó al caché en lugar de hacer una llamada json.
fuente
debe eliminar el tipo de datos: "json". Entonces vea la magia ... la razón de hacer eso es que está convirtiendo el objeto json en una cadena simple ... por lo que json parser no puede analizar esa cadena debido a que no es un objeto json.
fuente
en caso de obtener la operación desde web .net mvc / api, asegúrese de que está permitido obtener
fuente
También recibí "Solicitud de devolución con error: parsererror". en la consola javascript. En mi caso, no se trataba de Json, pero tuve que pasar al área de texto de vista una codificación válida.
fuente
He encontrado dicho error, pero después de modificar mi respuesta antes de enviarlo al cliente funcionó bien.
fuente
Tuve el mismo problema, resultó que
web.config
no era lo mismo con mis compañeros de equipo. Así que por favor revisa tuweb.config
.Espero que esto ayude a alguien.
fuente
El problema
window.JSON.parse genera un error en la función $ .parseJSON.
Mi solución
Sobrecargando JQuery usando la herramienta requirejs .
Contenido del archivo jquery.overload.js
fuente
Si no desea eliminar / cambiar
dataType: json
, puede anular el análisis estricto de jQuery definiendo una costumbreconverter
:Con esto, puede personalizar el comportamiento cuando la respuesta no se puede analizar como JSON (¡incluso si obtiene un cuerpo de respuesta vacío!)
Con este convertidor personalizado,
.done()
/success
se activará siempre que la solicitud haya sido satisfactoria (código de respuesta 1xx o 2xx).fuente