6

ログインに部分ビューを使用しています。成功するとユーザーを新しいページにリダイレクトし、モデルが無効な場合は部分ビューに検証エラーを表示したいと考えています。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);
        }
4

1 に答える 1

8

リダイレクトを実行するには、クライアント側で行う必要があります。そのため、使用できなくなりましUpdateTargetIdたが、代わりにOnSuccessオプションを使用する必要があります。また、コントローラー アクションを変更してLogon、リダイレクトの場合にそれが ajax リクエストであるかどうかをテストし、この場合は JavaScript で使用されるリダイレクト URL を含む Json オブジェクトを返すようにする必要があります。

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>
于 2009-12-26T18:24:38.700 に答える