代码之家  ›  专栏  ›  技术社区  ›  Jon Smock

UserControl的RenderControl正在(C#NET)中请求一个表单标记

  •  12
  • Jon Smock  · 技术社区  · 17 年前

    我问 how to render a UserControl's HTML

    现在,我尝试使用LoadControl加载以前生成的控件并输出其HTML,但它给出了以下信息:

    实际上我并没有将控件添加到页面中,我只是试图获取它的HTML。有什么想法吗?

    下面是我正在使用的一些代码:

    TextWriter myTextWriter = new StringWriter();
    HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter);
    
    UserControl myControl = (UserControl)LoadControl("newUserControl.ascx");
    myControl.RenderControl(myWriter);
    
    return myTextWriter.ToString();
    
    5 回复  |  直到 7 年前
        1
  •  16
  •   John B    15 年前

    或者,您可以在将控件呈现为字符串的页面上禁用ServerForm/事件验证。

    下面的示例说明了如何执行此操作。

    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string rawHtml = RenderUserControlToString();
        }
    
        private string RenderUserControlToString()
        {
            UserControl myControl = (UserControl)LoadControl("WebUserControl1.ascx");
    
            using (TextWriter myTextWriter = new StringWriter())
            using (HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter))
            {
                myControl.RenderControl(myWriter);
    
                return myTextWriter.ToString();
            }
        }
    
        public override void VerifyRenderingInServerForm(Control control)
        { /* Do nothing */ }
    
        public override bool EnableEventValidation
        {
            get { return false; }
            set { /* Do nothing */}
        }
    }
    
        2
  •  1
  •   Jon Smock    17 年前

    我已经创建了一个新类,它继承了UserControl类,并且从中派生了我创建的所有其他“UserControl”。我将其称为formPartial(nod to Rails),这是在公共字符串renderMyHTML()方法中实现的:

    TextWriter myTextWriter = new StringWriter();
    HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter);
    
    UserControl myDuplicate = new UserControl();
    TextBox blankTextBox;
    
    foreach (Control tmpControl in this.Controls)
    {
        switch (tmpControl.GetType().ToString())
        {
            case "System.Web.UI.LiteralControl":
                blankLiteral = new LiteralControl();
                blankLiteral.Text = ((LiteralControl)tmpControl).Text;
                myDuplicate.Controls.Add(blankLiteral);
                break;
            case "System.Web.UI.WebControls.TextBox":
                blankTextBox = new TextBox();
                blankTextBox.ID = ((TextBox)tmpControl).ID;
                blankTextBox.Text = ((TextBox)tmpControl).Text;
                myDuplicate.Controls.Add(blankTextBox);
                break;
    
                // ...other types of controls (ddls, checkboxes, etc.)
    
        }
    }
    
    myDuplicate.RenderControl(myWriter);
    return myTextWriter.ToString();
    

    我脑海中浮现的缺点:

    1. 可能的控制(或控制你)
    2. 你需要把所有的钱都调走 来自 现有控件(文本框等)到
    3. 没有充分利用

        3
  •  1
  •   Community Mohan Dere    13 年前

    或者试试这个:

    Page tmpPage = new TempPage(); // temporary page
    Control tmpCtl = tmpPage.LoadControl( "~/UDynamicLogin.ascx" );
    //the Form is null that's throws an exception
    tmpPage.Form.Controls.Add( tmpCtl );
    
    StringBuilder html = new StringBuilder();
    using ( System.IO.StringWriter swr = new System.IO.StringWriter( html ) ) {
        using ( HtmlTextWriter writer = new HtmlTextWriter( swr ) ) {
            tmpPage.RenderControl( writer );
        }
    }
    
        4
  •  0
  •   Bob    17 年前

    您可以向用户控件添加表单,也可以使用常规html输入框

     <input type="text" />
    

    http://aspadvice.com/blogs/ssmith/archive/2007/10/19/Render-User-Control-as-String-Template.aspx

        public static string RenderView<D>(string path, D dataToBind)
        {
            Page pageHolder = new Page();
            UserControl viewControl = (UserControl) pageHolder.LoadControl(path);
            if(viewControl is IRenderable<D>)
            {
                if (dataToBind != null)
                {
                    ((IRenderable<D>) viewControl).PopulateData(dataToBind);
                }
            }
            pageHolder.Controls.Add(viewControl);
            StringWriter output = new StringWriter();
            HttpContext.Current.Server.Execute(pageHolder, output, false);
    
            return output.ToString();
        }
    

    如果不需要,可以删除数据绑定部件。

        5
  •  -1
  •   TechyGypo    12 年前

    我在使用与@TcKs类似的代码时遇到了同样的问题,但我无法使这些示例中的任何一个适用于我。我通过使用 LoadControl a方法 UserControl

    UserControl uc = new UserControl();
    Control c = uc.LoadControl("newUserControl.ascx");
    c.RenderControl(myWriter);
    
    推荐文章