unexpected syntaxerror parsererror datatype jquery ajax asp.net-mvc-4

jquery - parsererror - syntaxerror unexpected token in json at position 1 ajax



Redirección del lado del servidor después de la llamada jquery ajax en asp.net mvc 4 (3)

Esto me ayuda

return JavaScript("window.location = ''/''");

Árbitro. enlace Cómo obtener una respuesta ASP.NET MVC Ajax para redirigir a una nueva página ...

Estoy enviando información de inicio de sesión desde una llamada jQuery AJAX a un controlador MVC 4:

$.post(url, data, function (response) { if (response==''InvalidLogin'') { //show invalid login } else if (response == ''Error'') { //show error } else { //redirecting to main page from here for the time being. window.location.replace("http://localhost:1378/Dashboard/Index"); } });

Si el inicio de sesión es exitoso, quiero redirigir a un usuario desde el lado del servidor a la página correspondiente en función del tipo de usuario. Si el inicio de sesión falla, se envía una cadena al usuario:

[HttpPost] public ActionResult Index(LoginModel loginData) { if (login fails) { return Json("InvalidLogin", JsonRequestBehavior.AllowGet); } else { // I want to redirect to another controller, view, or action depending // on user type. } }

Pero hay problemas:

  1. Si este método devuelve ''ActionResult'', entonces recibo el error, not all code paths return a value .

  2. Si uso ''void'', no puedo devolver nada.

  3. Incluso si uso ''void'' sin retorno, no puedo redireccionar a otro controlador o vista debido a la naturaleza asincrónica de las llamadas jQuery AJAX.

¿Hay alguna técnica para manejar tales escenarios?


Tuve que hacer esto, pero ninguna de las soluciones que encontré realmente satisfizo mis requisitos extremos de JavaScript para analizar los errores que tuve que evitar para redirigir al cliente a la página de inicio de sesión.

Lo que hice fue enviar una respuesta de cadena "NOAUTH" simple desde mi atributo de Autorización personalizado, luego interceptar la respuesta de Ajax antes de que se tocara cualquier controlador de eventos, y redirigir al usuario configurando window.location.

Lado del servidor:

protected override void HandleUnauthorizedRequest(AuthorizationContext context) { if (context.RequestContext.HttpContext.Request.IsAjaxRequest()) { var result = new ContentResult {Content = "NOAUTH"}; context.Result = result; return; } }

Luego en el lado del cliente:

$.ajaxSetup({ dataFilter: function (data, type) { if (data !== "" && data === "NOAUTH") { window.location = ''/''; } return data; } });

Sin embargo, no recomendaría este enfoque. Si tiene que hacer esto, al menos sugiero poner el valor "NOAUTH" dentro del encabezado de respuesta http, luego leer el valor en un manejador completo JQuery global.

Lado del servidor:

HttpContext.Current.Response.AddHeader("NOAUTH", "1");

Lado del cliente:

$.ajaxSetup({ complete: function (jqXHR, textStatus) { if (jqXHR.getResponseHeader("NOAUTH") === ''1'') window.location = ''/''; } });

Tenga en cuenta que el uso de dataFilter es la única forma de interceptar solicitudes ajax antes de que se accione a cualquier otro controlador de eventos.


return generalmente regresa del método sin ejecutar ninguna declaración adicional en él, de lo else parte no es necesaria. De esta forma, te desharás de un problema n. ° 1.

En cuanto a la redirección, ¿por qué no devolver algún tipo de comando de redireccionamiento ?

[HttpPost] public ActionResult Index(LoginModel loginData) { if (login fails) { return Json(new {result = "InvalidLogin"}, JsonRequestBehavior.AllowGet); } return Json(new {result = "Redirect", url = Url.Action("MyAction", "MyController")}); }

Y luego en javascript:

$.post(url, data, function (response) { if (response.result == ''InvalidLogin'') { //show invalid login } else if (response.result == ''Error'') { //show error } else if (response.result == ''Redirect''){ //redirecting to main page from here for the time being. window.location = response.url; } });