代码之家  ›  专栏  ›  技术社区  ›  Farid

AJAX实现对于“点赞”按钮ASP不能正常工作。NET核心2.1

  •  1
  • Farid  · 技术社区  · 7 月前

    我想在用ASP编写的项目中实现“喜欢”按钮(只喜欢,不讨厌)。NET Core 2.1版本。这是一个折扣分类网站,希望访问者能够喜欢他们想要的帖子。由于我对命名空间没有任何问题,我将只从后端在控制器中提供action方法,如下所示:

     [HttpPost]
     public async Task<IActionResult> AddLike(int Id)
            {
                AdminPostModel postModel = new AdminPostModel();
                postModel.Post = await _offerDbContext.Posts.SingleOrDefaultAsync(x => x.Id == Id);
                var UserIP = _accessor.HttpContext?.Connection?.RemoteIpAddress?.ToString();
                var Myagent = Request.Headers["User-Agent"].ToString().Substring(0, 40);
                string MyVisit = UserIP + " " + Myagent;
                postModel.Visitinfos = await _offerDbContext.Visitinfos.ToListAsync();
                Visitinfo visitinfo = new Visitinfo();
                visitinfo.PostNumber = Id;
                visitinfo.Deviceinfo = MyVisit;
               if(postModel.Visitinfos.Any(x => x.PostNumber == visitinfo.PostNumber && x.Deviceinfo == visitinfo.Deviceinfo))
                {
                    ViewBag.Message = "Eyni elanı bir dəfədən çox bəyənə bilməzsiniz";
                    return Json(postModel.Post.LikeCount);
                }
                else
                {
                    _offerDbContext.Visitinfos.Add(visitinfo);
                     postModel.Post.LikeCount++;
                    await _offerDbContext.SaveChangesAsync();
                    return Json(postModel.Post.LikeCount);
                }
            }
    

    请不要将自己与用户IP或用户代理详细信息混淆,这与我的问题无关。我返回了JSON,其中包含了点赞数(LikeCount)的结果,这是Post模型的属性,并在此操作中通过视图模型访问了它。 以下是cshtml视图的部分帖子:

      @foreach (Post item in Model)
    {
      <div class="postcontent">
                                  <div class="row">
                                        <div class="col-lg-12 col-md-12">
                                            <div class="uppart">
                                                <h6>@item.Title</h6>
                                            </div>
                                            <div class="imgframe">
                                                @if (item.URL != null)
                                                {
                                                    <a href="@item.URL" target="_blank"> <img class="postimg" src="~/images/@item.Image"></a>
                                                }
                                                else
                                                {
                                                    <a asp-action="Detailed" asp-controller="Detailed" asp-route-id="@item.Id" target="_blank"><img class="postimg" src="~/images/@item.Image"></a>
                                                }
                                            </div>
                                            <div class="posttext">
                                                <p>
                                                    @item.Description
                                                </p>
                                                <p class="formore">
                                                   
                                                        <a href="@item.URL" target="_blank">ƏTRAFLI</a>
                                                </p>    
                                            </div>
                                            <div class="dates">
                                                <p class="postdate">Tarix: @item.CreatedDate.ToString("dd/MM/yyyy")</p>
                                                @if (item.ExpirationDate.ToString("dd/MM/yyyy") == "01.01.2021" || item.ExpirationDate.ToString("dd/MM/yyyy") == "01/01/2019")
                                                {
                                                    <p class="expdate">Bitme tarix: Naməlum</p>
                                                }
                                                else
                                                {
                                                    <p class="expdate">Bitme tarix: @item.ExpirationDate.ToString("dd/MM/yyyy") </p>
                                                }
                                                **<button onclick="IncreaseLike(@item.Id)">Like</button>
                                                <p class="like"></p>**
                                            </div>
                                        </div>
                                    </div>
    

    如您所见,在按钮标签中,我为Post Id调用了IncreaseLike()函数,该函数在Javascript部分中使用,如下所示:

    @section Script{
        <script>
            function IncreaseLike(id) {
                $.ajax({
                    url: "/Home/AddLike",
                    type: "POST",
                    data: { id: id },
                }).done(function (result) {
                    $(".like").append(result);
                }
                   )
                };
            
        </script>
    }
    

    使用AJAX的目的是在点击“点赞”按钮后中断页面加载。但在运行应用程序时,点击“点赞”按钮后,它会在前一个1旁边添加新的1,而不是更新其位置上的数字。它将其应用于页面的所有帖子,而不仅仅是特定的点击帖子。也许是因为我把它附加到一个类(.like)中,但我不想为页面中的每个帖子定义不同的Id,我该如何实现ajax,使它只附加到所选的帖子,并且只通过增加like数字一次,而不是在数字旁边放置new?数据库没有问题,因为它不使用ajax,也不使用asp操作和asp控制器标签助手,但这会使页面在每次点击时加载。请仔细阅读我的代码,并协助查找可能来自JS部分(AJAX)的问题。

    2 回复  |  直到 7 月前
        1
  •  2
  •   Jerdine Sabio    7 月前

    你的jquery代码应该使用 .html() 其替换目标元素的HTML内容。

    @section Script{
        <script>
            function IncreaseLike(id) {
                $.ajax({
                    url: "/Home/AddLike",
                    type: "POST",
                    data: { id: id },
                }).done(function (result) {
                    $(".like").html(result);
                })
            };
        </script>
    }
    

    由于您不想为页面中的每个帖子添加数据id,请按照以下步骤替换 最近的邮局 从您单击的按钮。

    1. 将按钮元素替换为:;
    <button onclick="IncreaseLike(@item.Id,this)">Like</button>
    
    1. 添加新参数 button 根据您的功能和使用 .parent() 替换最近的 .like .
    @section Script{
        <script>
            function IncreaseLike(id, button) {
                $.ajax({
                    url: "/Home/AddLike",
                    type: "POST",
                    data: { id: id },
                }).done(function (result) {
                    $(button).parent().find(".like").html(result);
                })
            };
        </script>
    }
    
        2
  •  1
  •   Rory McCrossan Hsm Sharique Hasan    7 月前

    问题是因为 append() 如其名称所示,它将新数据附加到现有内容中。替换您可以使用的内容 html() 相反。

    但是,您可以通过使用 load() 方法向目标端点发出AJAX请求,并用该请求的响应替换所选元素的内容:

    function IncreaseLike(id) {
      $('.like').load('/Home/AddLike', { id: id });
    });