【发布时间】:2018-11-05 22:35:38
【问题描述】:
我有两个 ASPX 页面;它们使用相同的 DLL 和类,因此每个文件的第一行如下所示:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CustomPage.aspx.cs" Inherits="CustomPageCode.CustomPage" %>
(让两个 *.aspx 页面共享相同的代码隐藏可能是一种糟糕的形式,但我不想让两个单独的类具有相同的代码)
我正在通过一个隐藏字段“配置”每个页面——
Page1.aspx 有一行:
<asp:HiddenField ID="DepartmentName" value="DepartmentOne" runat="server" />
而Page2.aspx 有一行:
<asp:HiddenField ID="DepartmentName" value="DepartmentTwo" runat="server" />
我的 CodeBehind 读取 DepartmentName.Value 以根据每个部门特定的 HiddenField 的值执行一系列代码隐藏操作,例如 SQL 查询,并且 Javascript 也会读取该值以执行特定于部门的操作。我这样做是为了简化每个页面的配置——页面的配置方式就在 ASPX 页面中,并且相同的值对 ASPX 和 Javascript 都是可见的。
但是,如果任一页面执行 POST 事件 -- 现在 DepartmentName.Value 仅返回对任何具有相同代码隐藏的页面执行 POST 的页面的值。 Page1.ASPX,即使源中的asp:HiddenField 值仍然很明显是“DepartmentOne”,如果Page2.ASPX 进行了POST,DepartmentName.Value 将是“DepartmentTwo”,无论打开哪个页面。
有趣的是:如果我在 Chrome 中打开同一个页面,第一页仍然会有第二页的DepartmentName.Value,即使 POST 事件在 Chrome 中从未发生过;清除 IE 缓存也不能解决问题。这绝对是在服务器端发生的事情,被缓存在某个地方。 IIS 重置可以解决它。
Google 告诉我 ASP.NET 从 POST 事件中缓存了一堆东西,但没有确切说明它是如何处理的,或者如何启用/禁用它,或者它位于多个缓存位置中的哪个位置,许多示例看起来我必须专门告诉它以持久的方式开始缓存事物。我发现的最接近的东西是!IsPostBack 在Page_Load 开头的ModelState.Clear();,但这并不能解决它,据我所知,我没有在我的代码中使用MVC。
所以,我的问题是,我如何强制 GET 使用源代码中的隐藏值,而不是旧 POST 事件中的一些缓存值?
【问题讨论】: