【问题标题】:Adding controls and their events dynamically动态添加控件及其事件
【发布时间】:2011-10-01 23:43:14
【问题描述】:

我在 asp.net 中遇到问题

我正在使用 (asp.net/vb) 在 Visual Studio 2008 中开发一个网站

我必须允许注册用户构建页面并添加已由同一用户定义的控件。

我的问题是如何动态构建这个页面?

换句话说,我想像任何 CMS 一样制作(例如 Joomla)。 CMS 允许我们创建新页面并添加我们的控件然后保存它们...

我想了很多,我找到了一个解决方案,方法是制作一个代码生成器(从 A->Z)生成页面及其代码隐藏(apsx 文件和 aspx.vb 文件)

是否有任何工具或解决方案比我的解决方案更能帮助我?

感谢任何帮助。

【问题讨论】:

    标签: c# asp.net vb.net visual-studio-2008


    【解决方案1】:

    如果您查看 aspx 页面的设计器 cs 文件,您会注意到设计器在运行时将对象添加到页面的控件中。如果需要,您可以在运行时编译器服务为页面生成一个类,或者您可以创建一个函数,通过它的类型名称创建控件实例,然后将该对象添加到页面。

    Type.GetType("myControl").GetConstructor(new Type[] { typeof(string) }).Invoke(new object[] { "myString" });
    

    这将返回创建的控件,然后您可以按照设计器的相同方式进行连接。

    编辑:或者您可以查找compiler services。我曾经制作了一个程序,它采用基于 xml 的配置文件,并使用字符串生成器将其转换为可编译的 .cs 文件。然后我使用编译器服务将该文本编译成我执行的类。它开始了这样的生活:

    using System;
    public class MyConfigClass
    {
            {0}
            {1}
            {2}
        public MyConfigClass()
        {
        }
    }
    

    结果就是这样

    using System;
    public class MyConfigClass
    {
        public string FirstName{
            get;
            set;
        }
        public string LastName{
            get;
            set;
        }
        public string Age {
            get;
            set;
        }
    
        public MyConfigClass()
        {
    
        }
    }
    

    基于此信息

    <?xml version="1.0" encoding="utf-8"?>
    <ConfigProperties>
      <Property>
        <Name>FirstName</Name>
        <Value>John</Value>
      </Property>
      <Property>
        <Name>LastName</Name>
        <Value>Smith</Value>
      </Property>
      <Property>
        <Name>Age</Name>
        <Value>12</Value>
      </Property>
    </ConfigProperties>
    

    基本上,字符串构建器为每个属性采用:“public {0} {1}{get;set;}”,然后根据 xml 的值构建最终字符串。然后编译器服务把它变成了一个类。一旦创建了类,就可以将其存储起来以备将来使用。我做的另一个尝试是在网站项目中从磁盘运行代码文件,然后调用站点重新启动(这有效地重新编译了 IIS 在目录中找到的所有内容,包括您的新代码文件)。

    可能性:)

    【讨论】:

    • 谢谢,我觉得生成方式不合理!!有没有其他技术可以解决这个问题?
    • 我扩展了答案。我假设您有某种保存配置信息的数据存储
    猜你喜欢
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多