2009-12-26 9 views
6

Ich benutze eine Teilansicht für die Anmeldung und möchte den Benutzer auf eine neue Seite bei Erfolg umleiten und die Validierungsfehler in der Teilansicht zeigen, wenn das Modell ungültig ist. Das Ajax-Ziel wird aktualisiert und Erfolg oder Misserfolg. Wenn das Modell gültig ist, zeigt es die gesamte neue Seite im Aktualisierungsziel an, aber ich möchte, dass es auf die neue Seite umleitet. Ich habe Redirect und RedirecttoAction versucht, aber es bringt nicht die gewünschten Ergebnisse. Irgendwelche Ideen, was ich tun kann, um ein Ajax-Update zu erhalten, um auf eine neue Seite umzuleiten, das Ziel nicht zu aktualisieren. Lassen Sie es mich auch wissen, wenn ich den falschen Ansatz verwende.Ajax Redirect auf Seite statt Update Ziel

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


      <% } %> 

Hier ist der entsprechende Code-Controller:

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

Antwort

8

So führen Sie eine Umleitung Sie benötigen sie auf der Client-Seite zu tun. Sie können also nicht mehr UpdateTargetId verwenden, sondern stattdessen die Option OnSuccess. Sie müssen auch die Logon Controller-Aktion ändern, so dass im Falle einer Umleitung Sie testen, ob Sie es sich um eine Ajax-Anforderung ist und in diesem Fall ein JSON-Objekt mit der Umleitungs-URL zurück, die in Javascript verwendet wird:

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

Und in der Ansicht:

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