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);
        }
6
задан tereško 5 July 2013 в 11:27
поделиться

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>
8
ответ дан 16 December 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: