У меня есть пользовательский элемент управления, который должен использовать кэширование с VaryByControl
. Файл .ascx
выглядит так:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TestControl.ascx.cs" Inherits="mynamespace.TestControl" %>
<%@ OutputCache Duration="10" Shared="true" VaryByControl="Test" %>
<p id="SomeText" runat="server">Nothing</p>
Класс TestControl
в файле кода программной части имеет свойство int Test {...}
и обработчик событий Page_Load()
, который заполняет абзац SomeText
:
SomeText.InnerText = string.Format(@"Test={0} at {1}", Test, DateTime.Now)
У меня есть файл .aspx
, который выглядит так:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestPage.aspx.cs" Inherits="mynamespace.TestPage" %>
<%@ Register TagPrefix="xxx" TagName="TestControl" Src="Controls\TestControl.ascx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<xxx:TestControl Test="6" runat="server" />
<xxx:TestControl Test="7" runat="server" />
<hr />
<asp:PlaceHolder ID="Suport" runat="server" />
</body>
</html>
Два тега <xxx:TestControl>
правильно загружают экземпляры TestControl
с Test
, установленным на ожидаемое значение, я могу обновить браузер несколько раз и вижу, что кеш правильно выполняет свою работу.
Теперь я хотел бы заполнить <asp:PlaceHolder ID="Suport" />
некоторыми экземплярами TestControl
, используя различные значения Test
, которые должны выиграть от правильного кэширования. Я пытаюсь использовать метод LoadControl
, но не могу найти способ указать значение свойства Test
. Я ожидаю, что такой метод существует, ведь asp.net
коду, загружающему .aspx
страницу, удается найти правильный кэшированный элемент управления. Все, что я получаю, это экземпляр PartialCachingControl
без инициализированного CachedControl
, и во время выполнения визуализированный TestControl
показывает, что Test
имеет значение по умолчанию 0
.
Вот как выглядит мой обработчик событий .aspx
Page_Load()
:
protected void Page_Load(object sender, EventArgs e)
{
PartialCachingControl tc = (PartialCachingControl) LoadControl(@"Controls\TestControl.ascx");
if (tc.CachedControl != null)
((TestControl)tc.CachedControl).Test = 67;
Suport.Controls.Add(tc);
}
Редактировать
Я мог бы обойти эту проблему, закэшировав всю страницу, но мне кажется странным, что я не могу найти способ сделать это таким образом. Тем более, что вызов элемента управления через файл ASPX работает, как и ожидалось (доказывая, что есть способ).
Редактировать 2
Хм, ответов пока нет. Я начал щедрость, надеюсь, она получит немного больше внимания.