2009-12-26 4 views
6

J'utilise une vue partielle pour la connexion et souhaite rediriger l'utilisateur vers une nouvelle page en cas de succès et afficher les erreurs de validation dans la vue partielle si le modèle est invalide. La cible ajax est en cours de mise à jour et de réussite ou d'échec. Si le modèle est valide, il affiche la totalité de la nouvelle page dans la cible de mise à jour, mais je souhaite la rediriger vers la nouvelle page. J'ai essayé Redirect et RedirecttoAction mais il n'obtient pas les résultats désirés. Toutes les idées sur ce que je peux obtenir obtenir une mise à jour ajax pour rediriger vers une nouvelle page, pas mettre à jour la cible. Aussi, laissez-moi savoir si j'utilise la mauvaise approche.Ajax Rediriger vers la page au lieu de mettre à jour la cible

partielle sur le code:

<% 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" /> 


      <% } %> 

Voici le code du contrôleur concerné:

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); 
     } 

Répondre

8

Pour effectuer une redirection que vous devez faire sur le côté client. Vous ne pouvez donc plus utiliser UpdateTargetId mais vous devez utiliser l'option OnSuccess. Vous devrez également modifier l'action du contrôleur Logon de sorte qu'en cas de vous redirigez tester si vous il est une demande ajax et dans ce cas retourner un objet JSON avec l'URL de redirection qui sera utilisé 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); 
} 

Et dans la vue:

<% 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> 
Questions connexes