asp.net提供了RenderControl()方法,该方法可以将后台动态定义的控件生成前台运行时的代码。例如,你可以在某个aspx页面中添加一个Button控件,然后用下面的方法查看生成的代码:        protected void Button1_Click(object sender, EventArgs e)
        {             System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
             System.IO.StringWriter stringWriter = new System.IO.StringWriter(stringBuilder);
             System.Web.UI.HtmlTextWriter htmlTextWriter = new System.Web.UI.HtmlTextWriter(stringWriter);
             TextBox tb = new TextBox();
             tb.ID = "t1";
             tb.Text = "text1";
             tb.Width = 1000;

             tb.RenderControl(htmlTextWriter);            string a = stringBuilder.ToString();
            Response.Write("<p />下面是RenderControl生成的代码:<br />" + System.Web.HttpUtility.HtmlEncode(a)+"<p />");
        }以上代码输出结果为:
下面是RenderControl生成的代码:
<input name="t1" type="text" value="text1" id="t1" style="width:1000px;" />
   但是,上面不是我要的结果。我要的是生成aspx中的html定义模式,即希望看到的是<asp:TextBox id="t1" runat="server" width:1000px">text1</asp:TextBox>,或者为:<asp:TextBox id="t1" runat="server" width:1000px" Text="text1" />。
   有没有办法生成上面需要的html定义脚本呢?当然是有的,只是需要根据判断来添加额外的属性,这个代码如下:
           private void AddHtmlControl(System.Web.UI.WebControls.TextBox  control, System.IO.StringWriter stringWriter)
        {
            using (System.Web.UI.HtmlTextWriter htmlTextWriter = new System.Web.UI.HtmlTextWriter(stringWriter))
            {
                //添加控件
                htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Id, control.ID, false);
                htmlTextWriter.AddAttribute("runat", "server", false);
                if (control.Width.Value > 0)
                {
                    htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Width, control.Width.Value.ToString(), false);
                }
                if (control.Height.Value > 0)
                {
                    htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Height, control.Height.Value.ToString(), false);
                }
                htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Tabindex, control.TabIndex.ToString(), false);                htmlTextWriter.RenderBeginTag("asp:TextBox");
 
                htmlTextWriter.RenderEndTag();            }        }
    上面的代码中,就能生成自己需要的脚本。只不过,中间用到了“if (control.Width.Value > 0)”部分。我想:既然在new TextBox()时指定了“tb.Width = 1000”,那为什么还需要判断呢?有没有一种方法,能将后台定义的服务器控件代码将前台html定义脚本结合起来,在生成前台html脚本时,只显示用户额外指明了的那部分属性?asp.net提供了此机制么?请高人指点。asp.net动态控件html脚本

解决方案 »

  1.   

    以上话题实际上是我在http://bbs.csdn.net/topics/390299628 这个帖子中的延续,其用意在这个帖子中说的很清楚。实际上,要生成aspx前台页面和后台cs文件不是没有可能的,上面就提供了生成前台的代码。至于后台,用CodeDom技术可以实现(但是如何用事件绑定前台的服务器控件还在摸索中)。这个帖子实际上不想对能不能实现这个问题做讨论,而是想问高手们当我们在后台任意new一个控件时,能不能同步生成前台的html定义脚本,就像我们在设计时(而不是在运行时)看到的一样。这样的一个好处是,不但可以任意创建aspx页面(包括后台),还可以将控件的状态固定下来,从而为用户再次修改和扩展提供方便。
      

  2.   

    是不是说C#代码生成ASPX页面,包含控件的输出?
    C#代码描述了一个控件,想得到ASPX设计时的标签码?
      

  3.   

    Refer:http://www.cnblogs.com/insus/archive/2012/10/30/2746239.html
      

  4.   

    不懂你是怎么想的,不管是什么动态脚本,最终都是要生成html标签才能被我们的浏览器所认识,你将<asp:TextBox id="t1" runat="server" width:1000px">text1</asp:TextBox>这类脚本返回给浏览器,浏览器是无法识别的,不可能让所有人都在客户端编译一次吧
      

  5.   

    使用ClientScriptManager向客户端注册脚本
      

  6.   


    我看不懂你这句话是什么意思。如果在new TextBox()之后赋值了Width=1000,凭什么在输出时就不去判断Width?什么叫做“额外的属性”呢?那你觉得那一个if判断代码是多余的,那么你就删除就好了。这有什么可问别人“为什么我要写if语句”的呢?实在是不懂你的意思。我只能猜测这段代码根本不是你设计你,你是在这里瞎猜别人写的代码。如果是这样,那么先去接受别人的代码,然后再自己动手亲自测试。没有实际测试,不要仅仅抱着愤青的态度读代码。
      

  7.   

    我来回复楼上的几个问题:
      就上面的这个例子而言,肯定是我写的——即使不是也没有关系,这么简单的几行代码是谁写的都不重要。这里再附加一句:我当时是想把定义TextBox的那段代码变红的,结果不但没有变红,还多出了一个span标记。这个论坛很龌龊,改还不让人改。  我之所以说是“额外”的判断,是因为如果不在 new TextBox()中指定这个属性,在运行时展现给用户也是会有宽度的,这就像我们在设计界面拖出了一个Text控件,在aspx文件中就能看到它的html脚本,但是这个脚本并不包含Width、Height这些属性,然而这些属性的确不影响控件的展现(例如不指定Width控件也有宽度,而且不是0:例如TextBox是148px)。这意味着它们是有默认的属性的。既然如此,那么就可以不判断了,直接用htmlTextWriter.AddAttribute(,,)方法生成好了。但实际上如果真的这样,是取不到这些值的——感觉这些默认的值都为空,所以如果按这种方法来处理生成的html脚本是有错误的。
       
       其实上面说了这么多,都只是在探索如何动态生成html的脚本。正如我在这里例子的后台中定义了一个tb并指定了一些属性,那么能不能根据后台自动产生aspx前台的脚本呢,也就是我在#1中说的“希望看到的”那两种结果,而不是变红的那个结果。   另外,作为一个搞技术的人,我觉得需要有一种探索和谦虚的精神。而且,在上面的例子中,我并没有觉得我有丝毫的“愤青”,我不知道楼上何出此言。
      

  8.   

    其实,我想做的就一件事:
       能不能将复杂的编程变成一件很简单的事,让每一个不懂软件编程开发的人员都可以通过简单的配置就能生成他们要的表单(aspx页面及其aspx.cs文件,或称为“模板”)。这里之所以要强调生成aspx页面的html脚本,主要是考虑到展现时能看到预定的效果,同时也使后台的处理变得更容易(例如各种事件生命周期更容易得到控制、控件状态能得到保持)。
      

  9.   

    我觉得没必要花太多心思来研究怎么模拟 IDE 来生成控件代码,因为 IDE 已经解决了。
      

  10.   

    我觉得这样还是很有意义的。
       已经有很多人研究怎么动态生成后台DAL逻辑了,但是如果不是很懂编程开发的人,很难利用这个逻辑。如果能自动跟前台进行关联,那将是一件另人振奋的事,它将彻底改变人们编程的模式。就像二十年前电脑只有很专业的人才能玩得开一样,如今已经走向了每一个普通的员工。我觉得这是有划时代的意义的。
      

  11.   

    百度动态添加服务器控件。别把asp和php那一套往.NET里面套
      

  12.   


    不直接输出,是要全新自动生成一个aspx文件(包括.cs文件),包含所有的业务逻辑。
    如果直接输出我完全可以从后台new出一些控件来,但是这样对于复杂的页面来说是无能为力的。在 http://bbs.csdn.net/topics/390299628 中我已经做了一些说明。