更新数据库没有回发
本文关键字:数据库 更新 | 更新日期: 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:UpdatePanel
与UpdateMode = Conditional
之间。在这种情况下,所有的链接按钮都将在更新面板内,并且它们不会在回发后更新页面。
我要和所有人说的UpdatePanel相反,这样你就知道还有其他选择。
如果你只是想有滚动位置不改变从回发,设置MaintainScrollPositionOnPostBack
属性的页面。例子:
<%@ Page MaintainScrollPositionOnPostBack="true" />
但是,如果您根本不想要回发,请阅读本文。我真的不喜欢UpdatePanel。它带来的麻烦几乎总是大于它的价值。如果希望防止回发而不使用UpdatePanel,则可以使用AJAX调用服务器端并在服务器端执行更新。您将需要一个Web服务(ASMX)或Web API或WCF。WCF是最灵活但也是最陡峭的学习曲线。Web服务真的不应该再被使用了,所以Web API是一个很好的选择。在客户端,为了使我的调用更容易,我倾向于使用jQuery AJAX。
这样做的方式是,当你的喜欢或不喜欢按钮被点击时,你将运行一个JavaScript函数。该函数将调用服务器端方法来更新数据库,并返回一个成功标志。如果成功,更新您的UI,以表明喜欢或不喜欢是成功的。