将.net控件渲染为字符串并将事件触发

Hir*_*sai 2 .net vb.net asp.net webforms

我有这个问题,我正在尝试生成HTML,以显示在来自数据库的页面上,该页面以模板的形式显示,该模板具有不同的大括号,在运行时被动态内容替换.例如,大括号{Content}被替换为一些复选框列表,radiobuttonlists,文本框和提交按钮.我这样做的方法是动态创建控件并将它们呈现为字符串,然后将该字符串输出到浏览器.但它的作用是,它不会识别生成控件时分配给控件的事件.我可能对这个问题采取了错误的方法,但我真的不知道如何实现这一目标.我在下面提供了一些示例代码来展示我正在努力实现的目标.请告知如何解决此问题.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then

        Dim PageContent As StringBuilder = New StringBuilder()
        PageContent.Append("A lot of content from database laid out using HTML templates stored in database including the below mentioned button code.")

        '# To illustrate how pagecontent is built using lots of such controls rendered to string
        Dim SubmitButton As Button = New Button()
        SubmitButton.ID = "MySubmitButton"
        SubmitButton.Text = "Submit"
        SubmitButton.CssClass = "SubmitButton"
        'Page.Controls.Add(SubmitButton)        '# This line I thought would resolve the issue, but it doesn't as the .net form is not built at the time of page load
        AddHandler SubmitButton.Click, AddressOf ClickHandler

        PageContent.Append(RenderControlToString(SubmitButton))

        Dim Output As Literal = New Literal()
        Output.Text = PageContent.ToString()
        Page.Controls.Add(Output)

    End If

End Sub

''' <summary>
''' Button Click Hander
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub ClickHandler(ByVal sender As System.Object, ByVal e As System.EventArgs)

    '# Control never gets here!!!!!
    Response.Write("<br/>Button Clicked!")
    Response.End()

End Sub

''' <summary>
''' Render control to string
''' </summary>
''' <param name="control"></param>
''' <returns></returns>
''' <remarks></remarks>
Private Function RenderControlToString(control As Control) As String

    Dim sb = New StringBuilder()
    Using sw = New StringWriter(sb)
        Using textWriter = New HtmlTextWriter(sw)
            control.RenderControl(textWriter)
        End Using
    End Using

    Return sb.ToString()

End Function
Run Code Online (Sandbox Code Playgroud)

谢谢你的建议!

Rud*_*ara 6

在.Net中动态加载控件有点令人困惑.我看到你正在做的事情有四个问题.

  1. 您试图仅在初始HTTP GET上动态添加控件(而不是在回发上).您需要每次都添加控件.你没有在这里绑定数据,你正在向页面控件树添加控件.每次页面运行时都需要添加这些控件.

  2. 您将控件呈现为字符串.不要这样做,只需将它们添加到页面控制树中,它们将在页面渲染期间自行渲染.

  3. 在创建控件时使用Page.LoadControl().这将创建控件并强制它的事件(页面事件生命周期)以赶上页面的其余部分.

  4. 您在页面事件生命周期中稍晚添加控件.尝试在Page_Init中添加控件.

这是一个将所有内容整合在一起的示例.它动态创建一个按钮,然后将其添加到占位符控件.

protected void Page_Init(object sender, System.EventArgs e)
{
  var button = LoadControl(typeof(Button), null) as Button;
  button.Click += clickHandler;
  myPlaceholder.Controls.Add(button);
}
Run Code Online (Sandbox Code Playgroud)