asp:HiddenField被缓存在服务器端的某个地方?

时间:2018-11-05 22:35:38

标签: c# asp.net .net forms iis

我有两个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将是“ {{1 }}”,无论打开哪个页面。

一个时髦的事情是:如果我在Chrome中打开同一页面,即使POST事件从未在Chrome中发生,但第一页仍将具有第二页的DepartmentTwo;清除IE缓存也无法解决。这绝对是服务器端发生的事情,被缓存到某个地方。 IIS重置可以解决该问题。

Google告诉我,ASP.NET从POST事件中缓存了一堆东西,但没有确切说明它的处理方式,启用/禁用方式,或者它位于多个缓存位置中的哪个位置,而且很多例子看起来我不得不专门告诉它以持久的方式开始缓存内容。我发现的最接近的东西是DepartmentName.Value开头ModelState.Clear();中的!IsPostBack,但这不能解决问题,到目前为止,我还没有在代码中使用MVC我所知。

所以,我的问题是,如何强制GET使用源代码中的隐藏值,而不是旧POST事件中的某些缓存值?

2 个答案:

答案 0 :(得分:2)

可能是ViewState,但是我要看更多的代码,这不只是一个疯狂的猜测。我确实看到了:

  

我不想有两个具有相同代码的单独的类)

是的,这是一件好事。但是听起来好像页面类本身中的代码太多,应该移到一个单独的实用程序类中,在该类中两个单独的页面现在可以共享相同的实用程序代码。或者,您想要一个单个 Department.aspx页面,该页面带有URL参数,例如:/Department.aspx?deptid=Department1/Department.aspx?deptID=Department2

然后从url参数(而不是隐藏字段)中删除键。如果您不喜欢丑陋的URL,则可以使用routing来获得如下更漂亮的URL:/Departments/Department1/Departmennts/Department2

答案 1 :(得分:0)

我发现了我的问题:

在与ViewState搏斗之后,事实证明我的问题不是隐藏字段被缓存,而是隐藏字段正在执行的操作。

在我的课程开始时,我有一个变量:

public static Dictionary<string, string> ThisDictionary = new Dictionary<string, string>();

我的代码使用ThisDictionary.Add()将ASPX隐藏字段中的值添加到-但我从未在实际函数中将ThisDictionary声明为'new',因此每次我向Dictionary添加元素时对于隐藏字段,它是使用同一个类在多个页面上保持持久的

因此,当我从我认为是隐藏字段的值加载我的值时,背后的代码将正确读取隐藏字段,但是当它在C#中执行操作时,它将使用Dictionary中的数据以及其他页面'数据,因此看起来隐藏字段值被缓存在某个地方。

通过在new Dictionary<string,string>()函数的开始处添加一条声明以将其声明为Page_Load,现在每次加载页面时它都会擦除字典,并且行为符合我的期望,仅包含特定页面上隐藏字段中的值。

(我知道我可能应该做的是在其中包含这些变量的单独的类,而不是将其全部混入页面加载时被调用的主要ASPX类中。下一个版本的内容)