asp: HiddenField где-то кэшируется на стороне сервера? - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть две страницы 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, чтобы выполнить кучу кодовых заданий, таких как запросы SQL, на основе значения HiddenField, специфичного для каждого отдела, а также 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, но точно не говорит, как он обрабатывается, или как его включать / отключать, или в каком из множества мест кэша он находится, и многие примеры выглядят так, как будто я должен специально указать это, чтобы начать постоянное кэширование. Самое близкое, что я нашел, это ModelState.Clear(); в !IsPostBack в начале Page_Load, но это не решает проблему, я не использую MVC в своем коде, насколько я знаю.

Итак, мой вопрос: как заставить GET использовать скрытое значение в исходном коде, а не какое-то кэшированное значение из старого события POST?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Я обнаружил свою проблему:

После борьбы с ViewState оказалось, что моя проблема не в том, что скрытые поля кэшируются, а в том, что делается со скрытыми полями.

В начале моего класса у меня есть переменная:

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

, что мой код использует ThisDictionary.Add() для добавления значений из скрытых полей ASPX - но я никогда не объявлял ThisDictionary как «новое» в моей фактической функции, поэтому каждый раз, когда я добавлял элемент в словарь скрытых полей, он был постоянным на нескольких страницах, используя один и тот же класс .

Итак, когда я загружаю свои значения из того, что я считаю скрытым полем, кодовое поле правильно читает скрытое поле, но когда оно выполняет действие в C #, оно использует данные в Словаре с кучей других страниц. «данные в нем, следовательно, создается впечатление, что значения скрытых полей где-то кешируются.

Добавляя оператор для объявления его как new Dictionary<string,string>() в начале моей функции Page_Load, он теперь очищает словарь при каждой загрузке страницы и теперь ведет себя так, как я ожидал, содержащий только значения из скрытого поля на конкретной странице.

(Я признаю, что мне, вероятно, следует сделать, это иметь отдельный класс с этими переменными, а не объединять все это в основной класс ASPX, который вызывается при загрузке страницы. Что-то для следующей версии)

0 голосов
/ 06 ноября 2018

Это, вероятно, ViewState , но мне нужно было бы увидеть больше вашего кода, чтобы это было не просто диким предположением. Я вижу это:

Я не хочу иметь два отдельных класса с одинаковым кодом)

Да, это хорошо. Но, похоже, у вас слишком много кода в самом классе страниц, который нужно переместить в отдельный класс утилит, где две отдельные страницы теперь могут совместно использовать один и тот же код утилит. В качестве альтернативы вам нужна страница single Department.aspx, которая принимает аргумент URL, например: /Department.aspx?deptid=Department1 или /Department.aspx?deptID=Department2

Затем отключите аргумент url, а не скрытое поле. Если вам не нравится уродливый URL, вы можете использовать маршрутизацию , чтобы получить более симпатичные URL, как это: /Departments/Department1 или /Departmennts/Department2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...