2009-12-26 10 views
6

Estoy utilizando una vista parcial para iniciar sesión y me gustaría redirigir al usuario a una nueva página en caso de éxito y mostrar los errores de validación en la vista parcial si el modelo no es válido. El objetivo Ajax se está actualizando y es exitoso o fallido. Si el modelo es válido, muestra toda la página nueva en el objetivo de actualización, pero quiero que lo redirija a la página nueva. He intentado redirigir y redireccionar a la acción, pero no está obteniendo los resultados deseados. Cualquier idea sobre lo que pueda obtener una actualización de Ajax para redirigir a una nueva página, no actualizar el objetivo. Además, avíseme si estoy utilizando el enfoque equivocado.Ajax Redirigir a la página en lugar de actualizar el objetivo

vistas parciales Código:

<% using (Ajax.BeginForm(
     "LogOn", 
     null, 
     new AjaxOptions { 
      HttpMethod = "POST", 
      UpdateTargetId = "SignInForm" 
     }, 
     new { 
      id = "SignInForm", ReturnUrl = Request.QueryString["ReturnUrl"] 
     })) { %> 

        <<Page HTML Controls>> 

        <input type="submit" value="Log On" /> 


      <% } %> 

Aquí está el código del controlador relevante:

public ActionResult Logon(LogOnModel model,string returnUrl) 
     { 
      if (ModelState.IsValid) 
      { 
      //Login Logic Code   
      if (!String.IsNullOrEmpty(returnUrl)) 
        { 
         return Redirect(returnUrl); 
        } 
        else 
        { 
         return RedirectToAction("Index", "App"); 
        } 

      } 

      // If we got this far, something failed, redisplay form 
      if (Request.IsAjaxRequest()) 
          return PartialView("LogOnControl"); 

      return View(model); 
     } 

Respuesta

8

Para realizar una redirección que hay que hacer en el lado del cliente. Por lo tanto, ya no puede usar UpdateTargetId, sino que debe usar la opción OnSuccess. También tendrá que modificar la acción Logon controlador, de modo que en caso de una redirección de probar si se trata de una petición Ajax y en este caso devolver un objeto JSON con la URL de redireccionamiento que será utilizado en javascript:

if (ModelState.IsValid) 
{ 
    if (string.IsNullOrEmpty(returnUrl)) 
    { 
     returnUrl = Url.Action("Index", "App"); 
    } 
    if (Request.IsAjaxRequest()) 
    { 
     return Json(new { returnUrl = returnUrl }); 
    } 
    return Redirect(returnUrl); 
} 

Y en la vista:

<% using (Ajax.BeginForm(
    "LogOn", 
    null, 
    new AjaxOptions { 
     HttpMethod = "POST", 
     OnSuccess = "success" 
    }, 
    new { 
     id = "SignInForm", ReturnUrl = Request.QueryString["ReturnUrl"] 
    })) { %> 
     <<Page HTML Controls>> 
     <input type="submit" value="Log On" /> 
<% } %> 

<script type="text/javascript"> 
function success(context) { 
    var returnUrl = context.get_data().returnUrl; 
    if (returnUrl) { 
     window.location.href = returnUrl; 
    } else { 
     // TODO: update the target form element with the returned partial html 
    } 
} 
</script> 
Cuestiones relacionadas