更新数据库而不回发

时间:2014-06-04 16:45:52

标签: c# asp.net

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

<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似乎有帮助,但我无法找到将其应用到我的页面的方法

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我会反对所有人说的UpdatePanel只是让你知道还有其他选择。

如果您只是希望滚动位置不从回发更改,请为页面设置MaintainScrollPositionOnPostBack属性。例如:

<%@ Page MaintainScrollPositionOnPostBack="true" />

但是,如果您根本不想要回发,请阅读此内容。我真的不喜欢UpdatePanel。它几乎总是会造成比它值得更多的麻烦。如果要阻止回发而不使用UpdatePanel,请使用AJAX调用服务器端并在那里执行更新。您需要Web Service (ASMX)或Web API或WCF。 WCF是最灵活但最陡峭的学习曲线。 Web Service实际上不应再被使用了,所以Web API是一个很好的方法。在客户端,为了使我的通话更容易,我倾向于使用jQuery AJAX

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