gpt4 book ai didi

.net - 将 .net 控件呈现为字符串并触发事件

转载 作者:行者123 更新时间:2023-12-01 01:26:19 27 4
gpt4 key购买 nike

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

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

谢谢指教!

最佳答案

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

  1. 您正在尝试仅在初始 HTTP GET(而非回发)上动态添加控件。您需要每次都添加控件。您不是在此处绑定(bind)数据,而是将控件添加到 Page 控件树。每次页面运行时都需要添加这些控件。

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

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

  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);
}

关于.net - 将 .net 控件呈现为字符串并触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6865241/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com