更新数据库没有回发

本文关键字:数据库 更新 | 更新日期: 2023-09-27 18:06:37

我在我的首页填充以下占位符:

<asp:PlaceHolder ID="plComments" runat="server"></asp:PlaceHolder>

在后面的代码中,我在里面放了一个表格:

var MyComments = (from dlc in db.DocumentLinkComments
                                  where dlc.PortalID == PortalID && dlc.DocumentLinkID == FeedID && dlc.HideComments.HasValue != true
                                    orderby dlc.DateCreated descending
                                    select new
                                    {
                                        CommentID = dlc.CommentID,
                                        Name = dlc.User.UserName,
                                        EmailAddress = dlc.User.Email,
                                        Comment = dlc.Comment,
                                        DateCreated = dlc.DateCreated,
                                        Like = dlc.Users.Any(u=>u.UserID == UserID)
                                    }
                                ).Take(GrabComments).ToList();
                if (MyComments.Count() > 0)
                {
                    bool ShowLike = db.DocumentLinks.FirstOrDefault(d=> d.DocumentLinkID == FeedID).HasLikeButton;
                    foreach (var MyComment in MyComments)
                    {
                        TableRow row = new TableRow();
                        TableCell cell = new TableCell();
                        // 1st Row
                        // -------
                        cell.HorizontalAlign = HorizontalAlign.Left;
                        cell.Text = MyComment.Comment.ToString();
                        row.Cells.Add(cell);
                        cell = new TableCell();
                        if (user.Roles.Any(r => r.Name == "ViewOnly"))
                        {cell.Text = " ";}
                        else
                        {
                            if (ShowLike)
                                {
                                    if (MyComment.Like)
                                    {
                                        LinkButton link = new LinkButton() { Text = " ", CssClass = "ThumbsUpSelected", ToolTip="Unlike this comment", ID = MyComment.CommentID.ToString(), CommandName="Unlike"  };
                                        link.Click += link_Click;
                                        cell.Controls.Add(link);
                                        cell.VerticalAlign = VerticalAlign.Top;
                                    }
                                    else
                                    {
                                        LinkButton link = new LinkButton() { Text = " ", CssClass = "ThumbsUp", ToolTip = "Like this comment", ID = MyComment.CommentID.ToString(), CommandName="Like" };
                                        link.Click += link_Click;
                                        cell.Controls.Add(link);
                                        cell.VerticalAlign = VerticalAlign.Top;
                                    }
                                }
                                else
                                { cell.Text = " "; 
                            }
                        }

                        row.Cells.Add(cell);
                        plComments.Controls.Add(row);

当我点击喜欢或不喜欢的图像时,这个函数被触发:

        private void link_Click(object sender, EventArgs e)
    {
        LinkButton link = (LinkButton)sender;
        int commentID = Convert.ToInt16(link.ID);
        string action = link.CommandName;
        using (var db = new CRMSEntities())
        {
           User user = db.Users.FirstOrDefault(u => u.Email == Page.User.Identity.Name);
           if (action == "Unlike") 
           {
               if (user.DocumentLinkComments1.Any(c => c.CommentID == commentID))
               {
                   user.DocumentLinkComments1.Remove(db.DocumentLinkComments.FirstOrDefault(c => c.CommentID == commentID));
                   db.SaveChanges();
               }
           }
           else if (action == "Like") 
           {
               if (!user.DocumentLinkComments1.Any(c => c.CommentID == commentID))
               {
                   user.DocumentLinkComments1.Add(db.DocumentLinkComments.FirstOrDefault(c => c.CommentID == commentID));
                   db.SaveChanges();
               }
            }
        }
    }

我的问题是这会触发回发,所以页面回到顶部

我不想让页面移动——我只想点击按钮,然后在后台更新数据库,不需要任何移动或回发

似乎有帮助在那里使用AJAX,但我找不到一种方法来应用它到我的页面

更新数据库没有回发

有很多方法可以做到这一点,其中可能保持大部分代码不变的方法是使用AJAX扩展并简单地将PlaceHolder包装在UpdatePanel中。您将需要添加一个ScriptManager到您的页面,然后创建一个UpdatePanel,并简单地将您的占位符放在它的ContentTemplate中。

尝试将您的占位符放在asp:UpdatePanelUpdateMode = Conditional之间。在这种情况下,所有的链接按钮都将在更新面板内,并且它们不会在回发后更新页面。

我要和所有人说的UpdatePanel相反,这样你就知道还有其他选择。

如果你只是想有滚动位置不改变从回发,设置MaintainScrollPositionOnPostBack属性的页面。例子:

<%@ Page MaintainScrollPositionOnPostBack="true" />

但是,如果您根本不想要回发,请阅读本文。我真的不喜欢UpdatePanel。它带来的麻烦几乎总是大于它的价值。如果希望防止回发而不使用UpdatePanel,则可以使用AJAX调用服务器端并在服务器端执行更新。您将需要一个Web服务(ASMX)或Web API或WCF。WCF是最灵活但也是最陡峭的学习曲线。Web服务真的不应该再被使用了,所以Web API是一个很好的选择。在客户端,为了使我的调用更容易,我倾向于使用jQuery AJAX。

这样做的方式是,当你的喜欢或不喜欢按钮被点击时,你将运行一个JavaScript函数。该函数将调用服务器端方法来更新数据库,并返回一个成功标志。如果成功,更新您的UI,以表明喜欢或不喜欢是成功的。