Доступ к "HtmlGenericControl" из главной страницы, где элемент управления был создан динамически
У меня есть главная страница "default.master" и страница содержимого "Store.aspx", каждая из которых имеет свою страницу с выделенным кодом. В коде позади главной страницы я динамически создаю ярлык с некоторым текстом в нем. Я хочу посмотреть текст метки на странице кода для "Store.aspx.cs", но мой код возвращает "нулевые" элементы управления...
В моем default.master.cs при загрузке страницы:
<label runat=\"server\" id=\"displayname\"><a href='MyAvatar.aspx'>" + displayName + "</a></label>
В моем Store.aspx.cs на странице загрузки:
HtmlGenericControl dName = (HtmlGenericControl)Master.FindControl("displayName");
if (dName != null)
Debug.Print("dName: " + dName.InnerText);
Это НЕ работает... Однако, если я добавлю метку прямо на страницу default.master, как это:
<label runat="server" id="displayName">TEST</label>
Затем, когда я загружаю Store.aspx, я ясно вижу в своем выводе отладки:
dName: TEST
Мне действительно нужно, чтобы ярлык создавался динамически, а также чтобы я мог иметь доступ к содержимому ярлыка не только из Store.aspx.cs, но и с 2 других страниц (и, возможно, еще больше в будущем). Есть идеи??
РЕДАКТИРОВАТЬ: я просто хотел отметить, что динамически созданная метка является частью большего элемента... Метка находится внутри ячейки таблицы, внутри строки таблицы, внутри таблицы, все из которых находится внутри буквального элемента управления... Что черт возьми, почему бы не вставить все это здесь, а? (Метка в 4-й строке)
userCP.Text = "<table width=100% border=0 cellpadding=0 cellspacing=0>" +
"<tr><td colspan=4 style=\"font-size: large\"><center><b>Welcome,</b></center></td></tr>" +
"<tr style=\"height: 5px; \"><td colspan=4></td></tr>" +
"<tr><td colspan=4><center><label runat=\"server\" id=\"displayname\"><a href='MyAvatar.aspx'>" + displayName + "</a></label></center></td></tr>" +
"<tr style=\"height: 5px; \"><td colspan=4></td></tr>" +
"<tr><td colspan=4><hr/></td></tr>" +
"<tr><td>" + leaderLink + "</td><td width=100% id=\"userCP_bones\" style=\"text-align:right; \">" + bones + "</td><td style=\"text-align:left;\"><b>/</b><a href='Store.aspx?SC=Acct' title='Click to upgrade your wallet!'>" + maxBones + "</a></td><td><center><img src='images/bone.png' alt='Bones' align='right' style=\"vertical-align:middle\"/></center></td></tr>" +
"<tr><td></td><td></td><td id='CartCount' style=\"text-align:right; text-decoration: underline; cursor:pointer; \"><a href='Checkout.aspx'>" + itemCount + "</a></td><td width=10%><center><a href='Checkout.aspx'><img src='images/cart.png' onmouseover=\"this.src='images/cart_h.png'\" onmouseout=\"this.src='images/cart.png'\" height='24' width='24' alt='Cart' align='right' style=\"vertical-align:middle; border:none\"/></a></center></td></tr>" +
"</table>";
РЕДАКТИРОВАТЬ: Основываясь на первом ответе, вместо буквального элемента управления для "userCP", я превратил его в таблицу ASP и добавить строки / ячейки в коде позади:
//Row for display name
TableRow r = new TableRow();
userCP.Rows.Add(r);
TableCell c = new TableCell();
r.Cells.Add(c);
c.ColumnSpan = 4;
Label l = new Label();
l.Text = "<center><a href='MyAvatar.aspx'>" + displayName + "</a></center>";
l.ID = "displayName";
c.Controls.Add(l);
Мой store.aspx.cs по-прежнему возвращает ноль при выполнении:
Debug.Print("Name: " + Master.FindControl("displayName"));
Даже если я бросил поиск:
(HtmlGenericControl)Master.FindControl("displayName")
(Label)Master.FindControl("displayName")
2 ответа
Вы не можете добавить управление на стороне сервера, напрямую манипулируя разметкой страницы из кода, потому что к этому времени страница уже создана. Если вы хотите динамически создавать элементы управления, а затем обращаться к ним из серверного кода, вам нужно добавить их в Controls
коллекция.
Вы должны построить свой ASP.Net HtmlTable
управление на стороне сервера (включая HtmlTableRow
и стол HtmlTableCell
и все связанные элементы управления) через реальный код на стороне сервера и добавьте полученную таблицу в userCP с чем-то вроде userCP.Controls.Add(myCreatedTable)
Просто чтобы очистить, уточнить и централизовать ответы и комментарии:
Не имеет значения, использую ли я LiteralControl или Asp:Table, нужное мне "displayName" теперь сохраняется как глобальная переменная в файле default.master.cs:
string displayName = "Guest";
public string dName()
{
return displayName;
}
И может быть найден с любой страницы контента, используя:
//Make sure the user has an account
string dName = ((_default)Master).dName();
if (dName == "Guest")
{
LiteralStoreHeader.Text = "<center><b>We're Sorry!</b><br/>You must have an Avatar account to view this page.</center>";
return;
}
Однако, если мне действительно нужно извлечь информацию из ячейки таблицы, не сохраняя ее в качестве переменной на странице default.master.cs, я также могу сделать это, используя таблицу ASP вместо LiteralControl, а затем поискать идентификатор метки:
Мастер код файл:
Label l;
public string FOO()
{
return l.Text;
}
protected void Page_Load(object sender, EventArgs e)
{
l = new Label();
l.Text = "Bar";
}
Файл кода содержимого:
string dName = ((_default)Master).FOO();