C# ASP.NET-通过xslt转换生成的控件

C# ASP.NET-通过xslt转换生成的控件,c#,asp.net,xml,xslt,C#,Asp.net,Xml,Xslt,我在asp.net页面上通过xml文件的xslt转换动态生成控件。稍后我需要从代码隐藏中引用这些控件。我想在创建期间(我想是在xslt文件中)将这些引用添加到list/hashtable/which中,以便以后可以访问它们,但我不知道如何做到这一点。 如果有任何建议,我将不胜感激, 阿格涅斯卡你能更好地了解你想做什么吗 XML>XSLT>生成aspx页面 听起来接近于重新发明windows演示文稿框架或XUL 还是这样 ASPX读取xml>使用XSLT将DOM元素添加到页面。。。 听起来像AJA

我在asp.net页面上通过xml文件的xslt转换动态生成控件。稍后我需要从代码隐藏中引用这些控件。我想在创建期间(我想是在xslt文件中)将这些引用添加到list/hashtable/which中,以便以后可以访问它们,但我不知道如何做到这一点。 如果有任何建议,我将不胜感激,
阿格涅斯卡

你能更好地了解你想做什么吗

XML>XSLT>生成aspx页面

听起来接近于重新发明windows演示文稿框架或XUL

还是这样 ASPX读取xml>使用XSLT将DOM元素添加到页面。。。 听起来像AJAX

您希望使用属性转换写出唯一的ID
使用纯XSL解决方案可能会很棘手

您可以调用一个模板,该模板迭代正在使用的xml节点,生成控件,并写出一个c#/VB脚本块,将它们添加到您选择的容器中

另一种选择是将msxsl:script添加到模板中,并使用c#或其他语言生成所需的输出。这有时比纯xsl解决方案更容易,但确实会带来性能成本


可能值得一看umbraco的源代码,它大量使用xsl,并且可能已经完成了您想要的功能。

一旦您使用XSLT转换了XML,您可以将输出传递给ASP.Net方法,它将返回您可以使用的控件。例如,此代码将在页面上放置两个按钮:

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);
}
受保护的无效页面加载(对象发送方,事件参数e)
{
//在此处获取XML并对其进行转换。此字符串表示
//转换后的输出
字符串内容=@“
";
变量控制=解析控制(内容);
foreach(控件中的var控件)
{
//在此处连接事件、更改设置等
}
//占位符只是页面上的ASP.Net占位符控件
//我希望控件在哪里结束
占位符.Controls.Add(控件);
}

谢谢你的回答

这就是我所做的(这不是我的代码,但我也是这么做的):

私有void CreateControls() { XPathDocument surveyDoc=新的XPathDocument(Server.MapPath(“ExSurvey.xml”)

}

第一个解决方案(来自泛型错误)不够好,因为我需要识别控件,例如在xslt转换期间,我将创建3组控件,所有控件都具有不同的ID。我想在不同的哈希表中放置对来自一个组的每个控件的引用,以便稍后知道每个组中有哪些控件


最好的解决方案是在创建控件时(在xslt代码中是这样),但我不知道这是否可行。

Ha!然后,我今天也从中学到了一些新的有用的东西!:-)我尝试了此操作并获得:foreach语句无法操作System.Web.UI.Control类型的变量,因为System.Web.UI.Control不包含“GetEnumerator”的公共定义
// 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);