2009-12-26 7 views
6

Sto utilizzando una vista parziale per l'accesso e desidero reindirizzare l'utente a una nuova pagina in caso di successo e mostrare gli errori di convalida nella vista parziale se il modello non è valido. L'obiettivo ajax viene aggiornato e il successo o il fallimento. Se il modello è valido, sta visualizzando l'intera nuova pagina nella destinazione dell'aggiornamento ma voglio reindirizzare alla nuova pagina. Ho provato Redirect e RedirecttoAction ma non sta ottenendo i risultati desiderati. Qualsiasi idea su cosa posso fare ottenere un aggiornamento Ajax per reindirizzare a una nuova pagina, non aggiornare la destinazione. Inoltre, fammi sapere se sto usando l'approccio sbagliato.Ajax Reindirizza alla pagina invece di aggiornare il target

Vista parziale Codice:

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


      <% } %> 

Ecco il codice di controllo rilevanti:

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

risposta

8

Per eseguire un redirect che devi farlo sul lato client. Quindi non è più possibile utilizzare UpdateTargetId ma si dovrebbe invece usare l'opzione OnSuccess. Sarà inoltre necessario per modificare l'azione Logon controller in modo che in caso di un redirect si prova se si tratta di una richiesta AJAX e in questo caso restituire un oggetto JSON con l'URL di reindirizzamento che sarà utilizzato in JavaScript:

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

E nella 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>