1

您好创建了一个链接,该链接执行对控制器的 ajax 调用,以便使用 ID UpdateCart 更新跨度。问题是,如果用户未经过身份验证,他将被发送到登录页面,并在页面上生成:

在此处输入图像描述

在此处输入图像描述

从图像中可以看出,我的整个标题标签是如何被复制并添加到跨度标签内的。这是我的代码:

    @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 请求的未经身份验证的用户重定向到登录页面。您可以让它为 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 回答