Я генерирую элементы управления динамически на моей странице asp.net путем преобразования xslt из файла xml. мне нужно будет ссылаться на эти элементы управления из кода позже. Я хотел бы добавить эти ссылки в список / хеш-таблицу / что угодно во время создания (в файле xslt, я полагаю), чтобы я мог связаться с ними позже, и я не знаю, как это сделать. Буду абсолютно признателен за любые предложения, Агнешка





Можете ли вы лучше понять, что вы пытаетесь сделать?
XML> XSLT> создает страницу aspx
Звучит близко к переосмыслению среды представления Windows или XUL
Либо это ASPX читает xml> использует XSLT для добавления элементов DOM на страницу ... Похоже на AJAX
Вы хотите записать уникальный идентификатор с помощью преобразования атрибута http://www.w3schools.com/XSL/el_attribute.asp
Может быть сложно с чистым решением XSL.
Возможно, вы сможете вызвать шаблон, который выполняет итерацию используемых вами xml-узлов, генерирует элементы управления и записывает блок сценария C# / VB, который добавляет их в контейнер по вашему выбору.
Другой вариант - добавить msxsl: script в ваш шаблон и использовать C# или другой язык для создания желаемого вывода. Иногда это может быть проще, чем решение в чистом виде xsl, но требует снижения производительности.
Возможно, стоит взглянуть на исходный код umbraco, который довольно широко использует xsl и, возможно, уже делает то, что вы ищете.
После преобразования XML с помощью XSLT вы можете передать вывод методу ASP.Net ParseControl, и он вернет ваши элементы управления, готовые к использованию. Например, этот код разместит на странице две кнопки:
protected void Page_Load(object sender, EventArgs e)
{
// Fetch your XML here and transform it. This string represents
// the transformed output
string content = @"
<asp:Button runat = ""server"" Text = ""Hello"" />
<asp:Button runat = ""server"" Text = ""World"" />";
var controls = ParseControl(content);
foreach (var control in controls)
{
// Wire up events, change settings etc here
}
// placeHolder is simply an ASP.Net PlaceHolder control on the page
// where I would like the controls to end up
placeHolder.Controls.Add(controls);
}
Я попробовал это и получил: оператор foreach не может работать с переменной типа System.Web.UI.Control, потому что System.Web.UI.Control не содержит общедоступного определения для 'GetEnumerator'
Спасибо за ответы на все вопросы.
Вот что я делаю (это не мой код, но я делаю то же самое):
частная пустота CreateControls () { XPathDocument surveyDoc = новый XPathDocument (Server.MapPath ("ExSurvey.xml"));
// Load the xslt to do the transformations
XslTransform transform = new XslTransform();
transform.Load(Server.MapPath("MakeControls.xslt"));
// Get the transformed result
StringWriter sw = new StringWriter();
transform.Transform(surveyDoc, null, sw);
string result = sw.ToString();
// parse the control(s) and add it to the page
Control ctrl = Page.ParseControl(result);
form1.Controls.Add(ctrl);
}
Первое решение (от Generic Error) недостаточно хорошо, потому что мне нужно идентифицировать элементы управления, например, во время преобразования xslt я создам 3 группы элементов управления, все с разными идентификаторами. Я хотел бы поместить ссылки на каждый элемент управления из группы в другую хеш-таблицу, чтобы позже я знал, какие элементы управления находятся в каждой группе.
Лучшим решением было бы сделать это как-нибудь при создании элемента управления (например, в коде xslt ..), но я не знаю, возможно ли это.
Ха! Тогда я и сегодня узнал кое-что новое и полезное от SO! :-)