【问题标题】:Duplicate header on ajax callajax调用中的重复标头
【发布时间】:2026-01-16 00:45:01
【问题描述】:

您已经创建了一个链接,该链接执行对控制器的 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"
                });
            }     
        }

如何停止创建重复的标头?

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    看看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,但它会将强类型视图模型传递给您的局部视图。

    【讨论】: