2009-12-26 78 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> 
相关问题