在Ajax调用重复头(Duplicate header on ajax call)

2019-07-17 16:14发布

嗨创建执行一个AJAX调用控制器,以更新与ID UpdateCart.The问题的跨度是,如果用户不authentificated他得到的链接发送到登录页面,这被在页面上生成的:

因为它可以从我的整个头标记被一些如何复制和跨度tag.This里面添加的图片可以看出是我的代码:

    @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"
                });
            }     
        }

如何停止重复标题的创作?

Answer 1:

看看在following blog post 。 在这篇文章中菲尔哈克说明如何可以在窗体身份验证模块配置停止重定向到登录页面,未经验证用户的AJAX请求。 你可以把它返回一个真正的401状态码给客户端AJAX请求。

而这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但它传递一个强类型的视图模式,你的部分观点。



文章来源: Duplicate header on ajax call