1

こんにちは、ID UpdateCartでスパンを更新するためにコントローラーへのajax呼び出しを実行するリンクを作成しました。問題は、ユーザーが認証されていない場合、ユーザーがログインページに送信され、これがページで生成されることです。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

画像からわかるように、ヘッダータグ全体が複製され、スパンタグ内に追加されます。これが私のコードです。

    @Ajax.ActionLink("Add To Cart" ,
                                 "AddToCart" ,
                                 "Products", 
                                 new {
                                        ProductId = @products.ElementAt(0).Value
                                     },
                                 new AjaxOptions{

                                                   InsertionMode = InsertionMode.Replace,
                                                   UpdateTargetId = "UpdateCart",
                                                   HttpMethod = "GET"
                                                })
public ActionResult AddToCart(string ProductId)
        {
            if( User.Identity.IsAuthenticated ) {
                string username = User.Identity.Name;

                CartHelperClass.AddToCart(ProductId , username);
                ViewBag.ItemsInCart = CartHelperClass.CountItemsInCart(username);

                return PartialView("_AddToCart");
            } else {
                return RedirectToAction("LogIn" , "Account" , new {
                    returnUrl = "Products"
                });
            }     
        }

重複するヘッダーの作成を停止するにはどうすればよいですか?

4

1 に答える 1

2

を見てくださいfollowing blog post。この投稿では、Phil Haackが、AJAX要求の認証されていないユーザーのログオンページへのリダイレクトを停止するようにFormsAuthenticationモジュールを構成する方法について説明します。AJAXリクエストに対して実際の401ステータスコードをクライアントに返すようにすることができます。

そして、この401はクライアント上で簡単に傍受され、window.location.hrefメソッドを使用してブラウザを手動でログオンページにリダイレクトするなど、必要なアクションを実行できます。

したがって、あなたの場合は、ajaxComplete()ハンドラーをサブスクライブするだけで、このハンドラー内で、応答ステータスが401であるかどうかをテストできます。これは、ユーザーが認証されていないことを意味し、ユーザーをログオンページにリダイレクトします。

したがって、AspNetHaack NuGet()をインストールしたら、ページ内のハンドラーInstall-Package AspNetHaackをグローバルにサブスクライブするだけです。.ajaxComplete()

<script type="text/javascript">
    $(document).ajaxComplete(function (e, xhr, settings) {
        if (xhr.status == 401) {
            alert('Sorry you must be authenticated in order to use this action. You will now be redirected to the LogOn page');
            window.location.href = '@FormsAuthentication.LoginUrl';
        }
    });
</script>

もちろん、これを設定した場合、これは意味がないため、AJAXコントローラーアクションからのリダイレクトを停止する必要があります。これで、コントローラーのアクションは次のようになります。

[Authorize]
public ActionResult AddToCart(string productId)
{
    string username = User.Identity.Name;
    CartHelperClass.AddToCart(productId , username);
    ViewBag.ItemsInCart = CartHelperClass.CountItemsInCart(username);
    return PartialView("_AddToCart");
}

TODO:このAddToCartアクションをリファクタリングして、ViewBagの使用を停止するが、強く型付けされたビューモデルを部分ビューに渡すようにすることを強くお勧めします。

于 2012-12-29T10:00:58.200 に答える