从站点子目录提交表单出现Invalid postback or callback argument错误如何解决
问题根本原因
该问题由ASP.NET WebForm的表单路径解析错误+IIS默认文档匹配逻辑共同导致:
- 当你访问
/Registration路径时,IIS匹配到子目录下的default.aspx返回页面,但WebForm默认生成的<form runat="server">标签的action属性错误解析为根目录的default.aspx,而非当前子目录下的页面。 - 表单提交时POST请求直接发送到根目录
default.aspx,根目录页面的视图状态、事件验证哈希与子目录页面生成的完全不匹配:哪怕你在子目录页面关闭了事件验证,实际处理POST请求的是根目录未关闭事件验证的default.aspx,所以依然会触发Invalid postback or callback argument错误,提交后地址栏也会变成根目录default.aspx的地址。 - 代码复制到根目录
registration_test.aspx后运行正常,是因为根目录下的页面生成的表单action指向自身路径,POST请求提交到正确的页面,事件验证和视图状态完全匹配。
验证方法
打开浏览器开发者工具(F12),查看/Registration页面的前端源码,找到<form>标签,可确认其action属性值为根目录default.aspx而非子目录路径。
解决方案
可任选以下一种方案修复:
- 手动指定表单action路径:在子目录
default.aspx的form标签上添加action属性,代码为<form id="form1" runat="server" action="./default.aspx"> - 动态设置提交路径:在子目录
default.aspx的Page_Load事件中添加代码form1.Action = Request.RawUrl;,动态获取当前访问路径作为表单提交地址 - 调整访问/配置逻辑:直接访问完整路径
https://www.website.com/Registration/default.aspx验证功能,确认正常后可通过IIS配置或URL重写规则,将/Registration的请求直接映射到子目录下的default.aspx,避免路径解析错误 - 检查全局重写规则:排查根目录
web.config中的URL重写规则,确认是否存在将子目录请求强制转发到根目录的规则,调整规则优先级排除子目录POST请求即可
内容的提问来源于stack exchange,提问作者Joe Defill
相关产品推荐
相关产品推荐

