gpt4 book ai didi

asp.net - 页面刷新再次触发事件

转载 作者:行者123 更新时间:2023-12-04 14:34:00 24 4
gpt4 key购买 nike

在asp.net中提交表单并刷新时,数据再次重新提交?
C# 中有没有办法在页面加载时捕获页面刷新事件?

最佳答案

ASP.NET 不提供直接执行此操作的方法。

另一方面,有一些技巧可以避免重复提交:

  • 提交后重定向。这是最糟糕的。即使它避免了重复提交,从用户的角度来看,这在现代 Web 应用程序中也是 Not Acceptable 。
  • 跟踪每个表单、每个 session 的提交 .当用户第一次提交表单时,请在 session 中记住这一点。如果发生另一次提交,请尝试确定是否必须将其丢弃(在某些情况下,不得丢弃;例如,如果我在 StackOverflow 上编辑我的答案一次,如果需要,我可以重复两次)。
  • 第一次提交后禁用 JavaScript 提交。这样就避免了在某些情况下用户双击提交按钮,或者第一次点击,等待并认为表单没有提交,从而第二次点击的情况。当然,不要依赖这个:JavaScript 可能被禁用,它在双击时有效但在 F5 刷新时无效,并且在所有情况下该技术都不是完全可靠的。

  • 作为示例,让我们尝试实现第二个。

    假设我们有一个评论框 this.textBoxComment允许用户在博客页面上添加新评论。提交是这样完成的:
    private void Page_Load(object sender, System.EventArgs e)
    {
    if (this.IsPostBack)
    {
    string comment = this.ValidateCommentInput(this.textBoxComment.Text);
    if (comment != null)
    {
    this.databaseContext.AddComment(comment);
    }
    }
    }

    如果用户点击两次,评论将被发布两次。

    现在,让我们添加一些 session 跟踪:
    private void Page_Load(object sender, System.EventArgs e)
    {
    if (this.IsPostBack)
    {
    if (this.Session["commentAdded"] == null)
    {
    string comment = this.ValidateCommentInput(this.textBoxComment.Text);
    if (comment != null)
    {
    this.databaseContext.AddComment(comment);
    this.Session.Add("commentAdded", true);
    }
    }
    else
    {
    // TODO: Inform the user that the comment cannot be submitted
    // several times.
    }
    }
    }

    在这种情况下,用户只能提交一次评论。其他所有评论都将被自动丢弃。

    问题是用户可能想要对几篇博客文章添加评论。我们有两种可能的方法来允许这样做。最简单的方法是在每个非回发请求上重置 session 变量,但这将允许用户在一个页面上提交帖子,加载另一个页面,而不是在第一个页面上点击刷新,从而提交两次评论但不是能够再在第二页上添加评论。
    private void Page_Load(object sender, System.EventArgs e)
    {
    if (this.IsPostBack)
    {
    if (this.Session["commentAdded"] == null)
    {
    string comment = this.ValidateCommentInput(this.textBoxComment.Text);
    if (comment != null)
    {
    this.databaseContext.AddComment(comment);
    this.Session.Add("commentAdded", true);
    }
    }
    else
    {
    // TODO: Inform the user that the comment cannot be submitted
    // several times.
    }
    }
    else
    {
    this.Session.Remove("commentAdded");
    }
    }

    更高级的一种是在 session 中跟踪提交评论的页面列表。
    private void Page_Load(object sender, System.EventArgs e)
    {
    List<string> commentsTrack = this.Session["commentAdded"] as List<string>;
    string blogPostId = this.ValidatePostId(this.Request.QueryString["id"]);
    if (blogPostId != null)
    {
    if (this.IsPostBack)
    {
    this.AddComment(commentsTrack);
    }
    else
    {
    if (commentsTrack != null && commentsTrack.Contains(blogPostId))
    {
    commentsTrack.Remove(blogPostId);
    }
    }
    }
    }

    private void AddComment(List<string> commentsTrack)
    {
    if (commentsTrack == null || !commentsTrack.Contains(blogPostId))
    {
    string comment = this.ValidateCommentInput(this.textBoxComment.Text);
    if (comment != null)
    {
    this.databaseContext.AddComment(comment);
    if (commentsTrack == null)
    {
    commentsTrack = new List<string>();
    }

    commentsTrack.Add(blogPostId);
    this.Session["commentAdded"] = commentsTrack;
    }
    }
    else
    {
    // TODO: Inform the user that the comment cannot be submitted
    // several times.
    }
    }

    关于asp.net - 页面刷新再次触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6014224/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com