2009-12-26 80 views
6

我正在使用局部視圖進行登錄,並希望將用戶重定向到成功的新頁面,並在部分視圖中顯示驗證錯誤(如果模型無效)。 ajax目標正在更新併成功或失敗。如果模型有效,它將顯示更新目標中的整個新頁面,但我希望它重定向到新頁面。我嘗試過重定向和RedirecttoAction,但沒有得到期望的結果。我有什麼想法可以讓ajax更新重定向到新頁面,而不是更新目標。另外,如果我使用了錯誤的方法,請告訴我。Ajax重定向到頁面而不是更新目標

局部查看代碼:

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


      <% } %> 

下面是相關的控制器代碼:

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

回答

8

要執行你需要做的是在客戶端重定向。因此,您不能再使用UpdateTargetId,而應該使用OnSuccess選項。您還需要修改Logon控制器動作,這樣在重定向的情況下,你測試,如果你是一個Ajax請求,在這種情況下返回一個JSON對象與重定向URL將在JavaScript中使用:

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

並在視圖中:

<% 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> 
相關問題