比如有个Template.aspx
<div id="divContent">
    <input type="button" value="保存"  onclick="alert(document.getElementById('divContent').innerHTML)"/>
    <br />
    <table><tr><td>请输入模板名称:</td><td>
    <input type="text" runat="server" id="txtTemplateName" />
    </td>
    <td>
        <asp:Button ID="Button8" runat="server" Text="生成模板" OnClick="Button8_Click" />
        </td>
     </tr></table>
    </div>
///////////////////////////////////////////////////////////////
现在想把以上的代码 写到一个用户控件
我以前的代码是:(先在js div.innerHtml保存到隐藏域)
  if (hiContent.Value != null && hiContent.Value != "")
        {
            //Method 1:
            strPath = strRootPath +"\\TemplateControl\\" + txtTemplateName.Value.Trim() + ".ascx";
            sw = new StreamWriter(strPath, false,Encoding.Default);
            string strHead = "<%@ Control Language='C#' AutoEventWireup='true' CodeFile='" + txtTemplateName.Value.Trim() + ".ascx.cs' Inherits='" + txtTemplateName.Value.Trim() + "' %>";
            sContent = strHead + "\n\n<div>"+hiContent.Value+"</div>";
            sw.Write(sContent);
            sw.Close();
}
===============================================================
问题是这样保存的代码毕竟跟我想要的不一样
比如<asp:TextBox runat="server">都变成了 <input type='text'> 关键是把
runat="server"去掉了 这样在以后加载这个用户控件的时候就无法对这个文本框进行赋值
===============================================================
动态加载和赋值代码如下:
  string strVisulPath = "TemplateControl\\mmm.ascx";
        Control UserControl = Page.LoadControl(strVisulPath);
        UserControl.ID = "dc";
        DynamicControl.Controls.Add(UserControl);        HtmlInputText tb = (HtmlInputText)DynamicControl.FindControl("dc").FindControl("TextBox2");
        tb.Value = "test";

解决方案 »

  1.   

    先去读这个文件.然后用正则找到
    <div id="divContent"> </div>之间的内容,然后写到用户控件
      

  2.   

    a.aspx
    <div></div>
    a.aspx.cs
    里面怎么读得到那个div呢?
      

  3.   

    先用StreamReader读出String,然后用正则找.
      

  4.   

    runat="server"肯定会去掉的,因为到了客户端就没有runat="server"了,所以innerHTML就不可能会有runat="server",其实一般生成模板不应该这样生成的,一般是自己想建立1个模板文件,就比如是model.xml文件,然后生成模板的时候就读取这个model.xml文件中的内容,把其中的一些内容替换成你输入的模板名称就好了,不应该根据页面来生成模板。PS:楼主的马甲还不少,^_^
      

  5.   

    木白兄的意思 是不是
    我就用innerHmtl过来的代码
    然后用正则 把input换成相应的TextBox 或者加个runat="server"?
      

  6.   

    还是用javascript实现吧用C#感觉用了不上当的方案解决了不失当的问题
      

  7.   

    回复人:cpp2017(慕白兄) ( 五星(高级)) 信誉:100  2007-08-17 10:54:37  得分:0

    先用StreamReader读出String,然后用正则找.
    ========
    不好意思 
    我真的不太明白怎么能获得那个String
      

  8.   

    System.IO.StreamReader sw = new StreamReader(Server.MapPath("模板文件"));
                string str = sw.ReadToEnd();
                sw.Close();
      

  9.   

    回复人:BearRui(AK-47) ( 两星(中级)) 信誉:110  2007-08-17 10:54:39  得分:0
    ===============================================
    你那方法可能不适合我
    因为我的改动很大 控件多少都可能不一样
      

  10.   


    木白兄 
    我这个动态生成ascx的内容
    来自aspx
    这样可以吧?
     System.IO.StreamReader sw = new StreamReader(Server.MapPath("a.aspx"));
    string str = sw.ReadToEnd();
    sw.Close();
      

  11.   

    因为我的改动很大 控件多少都可能不一样
    ---------------------
    如果你控件多少也是动态加载的,那慕白兄的方法也不行,如果你的控件是写死在你的Template.aspx页面中,就可以使用慕白兄的方法来实现.
      

  12.   


    a.aspx.cs里面去找a.aspx里面的div内容
    这个可能不行
    木白兄 因为我在找div的时候
    这个a.aspx还没成为文件
      

  13.   

    如果你控件多少也是动态加载的,那慕白兄的方法也不行,如果你的控件是写死在你的Template.aspx页面中,就可以使用慕白兄的方法来实现.
    ===============
    在写进ascx文件是时候 是固定的
      

  14.   

    写入ascx文件之前 对 Template.aspx 进行一些排版
    然后把div里面的内容写到ascx
    感觉木白兄的意思是
    我先生成这个Template.aspx
    然后在在另外一个页面里面对这个Template进行操作
      

  15.   

    这个a.aspx还没成为文件
    -----------------
    为什么,a.aspx在硬盘上就行了啊
      

  16.   

    白兄的意思是你的Template.aspx本来就存在在硬盘上,用记事本打开这个Template.aspx就能看到下面的内容:
    <div id="divContent">
    <input type="button" value="保存" onclick="alert(document.getElementById('divContent').innerHTML)"/>
    <br />
    <table><tr><td>请输入模板名称:</td><td>
    <input type="text" runat="server" id="txtTemplateName" />
    </td>
    <td>
    <asp:Button ID="Button8" runat="server" Text="生成模板" OnClick="Button8_Click" />
    </td>
    </tr></table>
    </div>
    ----------------------------------
    然后就想读取一般的txt文件一样读取Template.aspx的内容就行了。
      

  17.   

    比如这样
    Template.aspx
    <div><table>...</table><div>
    现在在Template.asp.cs里面想写
    Page_Load
    {
    System.IO.StreamReader sw = new StreamReader(Server.MapPath("Template.aspx"));
    string str = sw.ReadToEnd();
    sw.Close();
    }
      

  18.   

    上面的还没看懂.到底这个模板aspx存不存在,是不是固定的?
      

  19.   

    回复人:cpp2017(慕白兄) ( 五星(高级)) 信誉:100  2007-08-17 11:05:33  得分:0

    也就是说你页面的控件是动态添加上去的?
    ========
    你讲的方法是先生成这个Template.aspx
    然后在操作这个Template.aspx把里面的div内容正则出来我想的是如楼上叙
      

  20.   

    如果你的Template.aspx里的内容都是通过Template.aspx.cs文件生成的话,可能就只能自己在取的div的innerHTML后手动为那些控件加上runat="server"了。
      

  21.   

    我讲一下 哈 你耐心点流程是这样:
    先打开一个Template.aspx
    里面有很多控件
    用户可以把控件删除啊 改变Text等操作
    改变完以后
    我提供一个按钮 生成模板
    在这个按钮事件里面
    把Template.aspx div里面的内容复制到新建的ascx 文件
    就这样来生成模板
      

  22.   

    如果你的Template.aspx里的内容都是通过Template.aspx.cs文件生成的话,可能就只能自己在取的div的innerHTML后手动为那些控件加上runat="server"了。
    =====
    哈 我可能讲的有问题 或者那个名字取的误导你们
    我这个Template.aspx里面的内容是固定的
    至少在准备拷贝div内容之前是固定的 而不是从哪里取来的
      

  23.   

    因为用户需要在客户端自定义控件,因此读的内容行不通了,只能像BearRui(AK-47) (说的
    加工加runat="server"如果想做得好一点的话,把htmlweb控件替换成webcontrol
    如:
    <input type="text"....替换成<asp:textbox ...
      

  24.   

    明白了,就是你Template.aspx div里面的内容会根据用户的不同操作而不同
      

  25.   

    也就是讲取到div还是只有我那个方法?
    用js div.innerHTML
    然后在后台读取这个值
    然后对这个值的<input>都加个runat="Server"是这样的嘛?
      

  26.   

    恩,只能自己去替换你取到innerHTML了。
      

  27.   

    然后对这个值的<input>都加个runat="Server"
    ------------------
    恩,加上runat="Server"就行了,不过要注意你input的id有没有变化,因为ASPX生成html后id可能会变了,如果变了,可能id也要改。
      

  28.   

    这样不行吗?
    我在生成模板事件里面
    打开一个新页面
    然后用StreamReader操作这个Template.aspx?
      

  29.   

    打开一个新页面
    然后用StreamReader操作这个Template.aspx?
    ------------------
    但是你这个新页面是死的啊,不是你用户操作后的结果啊。
      

  30.   

    mar       k