防止 ASP.Net 中的表单重新提交(不重定向到我自己)

2024-05-14

我有一个带有表单元素的母版页(<form runat="server">),带有 Button 元素的内容页面(<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Sync" />),以及包含以下内容的代码隐藏页面Button1_Click功能。

用户来到该页面并单击按钮。代码隐藏代码(在服务器上)执行,其中更新数据库中的某些表。代码隐藏代码所做的最后一件事是设置InnerHTML内容页面上的 Span 元素,带有成功或失败消息。

这一切都很好。问题是,如果用户刷新页面,则重新提交表单,并且浏览器会询问这是否确实是用户想要的。如果用户回答是肯定的,则重新执行隐藏代码代码并再次更新数据库。如果用户做出否定响应,则不会发生任何事情。

重新执行Code Behind代码并不是什么大问题。它不会伤害任何东西。但这并不是我真正想要的行为。

我知道我可以使用 Response.Redirect() 重定向回页面,但用户永远不会看到我的成功或失败消息。我应该提到的是,该消息实际上不仅仅是“成功”或“失败”,否则我想我可以在重定向的查询字符串中添加一些内容。

有没有办法从代码隐藏代码中重置表单元素,以便在用户刷新页面时不会重新提交表单?

母版页...

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="IntuitSync.SiteMaster" %>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:ipp="">
    <head runat="server">
    </head>
    <body>
        <form runat="server">
            <div runat="server" id="mainContetntDiv">
                <asp:ContentPlaceHolder ID="MainContent" runat="server" />
            </div>
        </form>
    </body>
</html>

内容...

<%@ Page Language="C#" AutoEventWireup="true" MasterPageFile="~/Site.master" CodeBehind="SyncToCloud.aspx.cs" Inherits="IntuitSync.SyncToCloud" %>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Sync" />
    <span runat="server" id="SyncStatus"></span>
</asp:Content>

背后的代码...

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.Web;

namespace IntuitSync
{
    public partial class SyncToCloud : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            /*
                Do a bunch of stuff and put the results in syncResults which is a List.
            */
            SyncStatus.InnerHtml = string.Join("", syncResults.ToArray()); // I'd rather do this...
            //Response.Redirect(Request.Url.PathAndQuery, true);  // ...and not do this.
        }
    }
}

非常感谢任何和所有的帮助。


问题是您正在执行一个表单 POST,如果用户随后刷新页面,它会执行它应该执行的操作:重新提交 POST。没有其他办法了。因此,您可以选择以下选项:

  1. 重定向到确认页面,以某种方式将操作结果传递到确认页面(如果查询字符串/cookie等不可行,通常从某些数据存储库重新加载)。
  2. 重定向到同一页面,但通过查询字符串参数传递成功消息(或者愚蠢地将其存储在 session/ViewState/what-have-you-siliness 中)。
  3. 不要发布,而是执行表单获取,因为您似乎没有发布任何值,只是启动某种服务器端处理。为此,只需将表单从帖子更改为获取,或者仅创建链接。这里的危险是您不应该在任何 get 操作中执行任何转换/破坏性操作。

NOTE:确保清理所有用户输入(始终将用户输入视为邪恶)。

您可能会对最后一个选项感到最满意,但这一切都取决于“做一堆事情并将结果放入syncResults...”真正需要什么。

更新(几年后)

虽然它应该是显而易见的,但对于某些用户来说可能还不够明显:您永远不应该通过直接显示未经净化的“通过查询字符串参数的成功消息”来让自己遭受 XSS 攻击。这些建议假定这是显而易见的,但回想起来,在这方面应该是明确明确的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止 ASP.Net 中的表单重新提交(不重定向到我自己) 的相关文章

  • 如何在 ASP.NET MVC 中手动设置用户角色?

    我正在从事的这个项目要求我保留管理员用户的本地数据库 并为普通用户使用外部数据库 在管理数据库中通过身份验证的任何人都应被分配 管理员 角色 而通过其他数据库进行身份验证的任何人将始终被分配 用户 角色 我可以手动分配这些角色吗 我不需要角
  • HTTP部分上传、断点续传的标准方法

    我正在开发 http 客户端 服务器框架 并寻找处理部分上传的正确方法 与使用带有 Range 标头的 GET 方法进行下载相同 但是 HTTP PUT 并不打算恢复 据我所知 PATCH 方法不接受 Range 标头 有没有办法通过 HT
  • Rails f.check_box 设置选中/未选中值

    所以我在 Rails 中得到了一个带有复选框的表单助手 我希望该复选框在选中或取消选中时具有 thatvalue 或 thisvalue 值 我还没有找到如何设置它的地方 f check box field 我发现了类似的东西 但它不起作用
  • asp.net/jQuery:使用 jQuery 将数据发布到弹出窗口 [IE]

    我正在尝试在 asp net 应用程序中使用 jQuery 将数据发布到弹出窗口 如果弹出窗口打开 我会收到三个错误 第一个错误是 Errror the value of the property is null or undefined
  • 检查Cookie是否存在

    从快速搜索开始堆栈溢出我看到有人建议使用以下方法来检查 cookie 是否存在 HttpContext Current Response Cookies cookie name null 或 在一个Page class this Respo
  • JavaScript 表单提交 - 确认或取消提交对话框

    对于带有询问字段是否填写正确的警报的简单表单 我需要一个执行此操作的函数 单击按钮时显示警告框 有两个选项 如果单击 确定 则提交表单 如果单击 取消 警报框将关闭 并且可以调整并重新提交表单 我认为 JavaScript 确认可以工作 但
  • 在处理程序之后访问 HTTP 请求上下文

    在我的日志记录中间件 链中的第一个 中 我需要访问一些在链下游的某些身份验证中间件中编写的上下文 并且仅在处理程序本身执行之后 旁注 需要首先调用日志记录中间件 因为我需要记录请求的持续时间 包括在中间件中花费的时间 此外 当权限不足时 身
  • ASP.Net 控件的 InnerHTML 和 InnerText 属性之间的区别?

    例如 在使用 ASP NET 控件时 h1 text h1 如果我们想更改标题的文本 我们可以通过两个属性来完成InnerHTML and InnerText 我想知道这两个属性之间的基本区别是什么 InnerHtml让您直接输入 HTML
  • 在 ASP.NET 更新面板中使用时,文本框回发值中缺少回车符(ASCII 字符 13)

    我有一个 ASP NET TextBox 其 TextMode TextBox Mode Multi Line 在 AJAX 更新面板中使用 Text 值已预设为具有多行的值 当使用 Chrome 7 0 517 41 或 Firefox
  • PHP - 存储和计算无线电输入的总分

    我设计了一个基于网络的小型系统 其中有一个学校评估表 可以向可以访问该系统的特定用户询问一些问题 并且输入将是单选类型 1或2或3或4 该代码正在运行 可以将输入插入数据库 但我不知道计算总分并将其存储在数据库中的正确查询 这是当前正在运行
  • 如何在 ASP.NET 中获取负载均衡器后面的主机名?

    我有几台服务器和一个负载均衡器 我想显示当前正在为该页面提供服务的服务器名称 我在用HttpContext Current Request ServerVariables SERVER NAME and HttpContext Curren
  • OWIN中间件可以使用http会话吗?

    我有一些为 ASP NET 和 SignalR 复制的代码 我决定将其重写为 OWIN 中间件以删除这些重复 一旦我运行它 我注意到HttpContext Current Session为空 并且我没有看到任何会话对象IOwinContex
  • 如何使自定义错误页面在 ASP.NET MVC 4 中工作

    我想要显示 500 404 和 403 的自定义错误页面 这是我所做的 在 web config 中启用自定义错误 如下所示
  • 从表单身份验证中排除页面 - ASP.NET

    我知道有两种方法可以从表单验证中排除页面 通过使用包含需要排除的页面的文件夹中的另一个 web config 文件 或者使用 location 元素
  • Page_ClientValidate 未定义

    我正在使用 ASP NET 2 0 并使用 IE8 作为我的默认浏览器 但无论我尝试多少次 Page ClientValidate一直给我这个错误 它没有定义 我怎么解决这个问题 请帮忙 所以 我想你的页面中可能没有任何RequiredVa
  • 返回重定向作为对 Ajax(fetch、XHR 等)请求的响应

    如果浏览器收到对 ajax 请求的重定向响应 会发生什么 如果浏览器收到对 ajax 请求的重定向响应 会发生什么 如果服务器发送重定向 又名 302 响应加上 Location 标头 浏览器将自动遵循重定向 对此的回应second请求 假
  • 如何在 Web 表单中进行 Html.Encode

    我有一个 ASP NET Web 窗体应用程序 有一个带有文本框的页面 用户在其中输入搜索词用于查询数据库 我知道我需要防止 JavaScript 注入攻击 我该怎么做呢 在 MVC 中我会使用Html Encode Web 表单中似乎无法
  • 同一服务器上的多个.NET版本

    所以我一直都知道在一台计算机 客户端或服务器 上运行多个版本的 NET 框架是可以的 这个问题 https stackoverflow com questions 407306 running many versions of net on
  • 从 HTTP 登录到 HTTPS

    我的网站默认使用 HTTP 我确实有一个启用 HTTPS 的证书 但只有其上的某些区域强制建立安全连接 登录是通过 Ajax 处理的 我想开始使用 SSL 即使请求来自 HTTP 我尝试强制请求的地址具有 HTTPS 并且它完美地回复 然而
  • 有没有办法使用 ASP.NET 在用户离开页面时始终运行某些服务器端代码?

    我想知道当用户离开 ASP NET 中的页面时是否有任何方法可以始终运行一些服务器端代码 页面卸载事件不好 因为如果有人单击链接 则不会调用该事件 理想情况下 即使用户关闭浏览器 我也希望代码能够运行 我怀疑我所问的问题是不可能的 但问一下

随机推荐