【问题标题】:asp:HiddenField being cached server-side somewhere?asp:HiddenField 被缓存在服务器端的某处?
【发布时间】: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 事件中缓存了一堆东西,但没有确切说明它是如何处理的,或者如何启用/禁用它,或者它位于多个缓存位置中的哪个位置,许多示例看起来我必须专门告诉它以持久的方式开始缓存事物。我发现的最接近的东西是!IsPostBackPage_Load 开头的ModelState.Clear();,但这并不能解决它,据我所知,我没有在我的代码中使用MVC。

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

【问题讨论】:

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


    【解决方案1】:

    它可能是ViewState,但我必须看到更多你的代码才能让这不仅仅是一个疯狂的猜测。我确实看到了:

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

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

    然后关闭 url 参数,而不是隐藏字段。如果你不喜欢丑陋的 URL,可以使用routing 来获得更漂亮的 URL,如下所示:/Departments/Department1/Departmennts/Department2

    【讨论】:

      【解决方案2】:

      我发现了我的问题:

      在与 ViewState 搏斗之后,我发现我的问题不是隐藏字段被缓存,而是隐藏字段正在做的事情。

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

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

      我的代码使用ThisDictionary.Add() 将值从 ASPX 隐藏字段添加到 - 但我从未在我的实际函数中将 ThisDictionary 声明为“新”,所以每次我向隐藏字段字典添加一个元素时,它是持久的使用同一个类的多个页面

      因此,当我从我认为是隐藏字段的内容中加载值时,代码隐藏会正确读取隐藏字段,但是当它在 C# 中执行操作时,它会将字典中的数据与其他页面一起使用' 数据,因此隐藏字段值被缓存在某处的外观。

      通过在我的Page_Load 函数的开头添加一个声明以将其声明为new Dictionary&lt;string,string&gt;(),它现在在每次加载页面时都会清除字典,现在它的行为符合我的预期,仅包含隐藏的值特定页面上的字段。

      (我承认我应该做的是有一个单独的类,其中包含这些变量,而不是将它们全部集中到页面加载时调用的主 ASPX 类中。下一个版本的东西)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-24
        • 1970-01-01
        • 1970-01-01
        • 2012-11-28
        • 2014-12-02
        • 2012-09-29
        • 2023-04-08
        相关资源
        最近更新 更多