Ajax Redirect на страницу вместо обновления цели

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

person scottrakes    schedule 26.12.2009    source источник


Ответы (1)


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