Ajax Redirect на страницу вместо обновления цели - PullRequest
6 голосов
/ 26 декабря 2009

Я использую частичное представление для входа в систему и хотел бы перенаправить пользователя на новую страницу в случае успеха и показать ошибки проверки в частичном представлении, если модель недействительна. Цель AJAX обновляется и успешно или неудачно. Если модель действительна, она показывает всю новую страницу в цели обновления, но я хочу, чтобы она перенаправляла на новую страницу. Я пробовал Redirect и RedirecttoAction, но это не дает желаемых результатов. Любые идеи о том, что я могу сделать, включают обновление 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);
        }

1 Ответ

8 голосов
/ 26 декабря 2009

Для выполнения перенаправления вам нужно сделать это на стороне клиента. Таким образом, вы больше не можете использовать 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>
...