在标记中使用函数返回的服务器控件

本文关键字:函数 返回 服务器控件 | 更新日期: 2023-09-27 18:25:24

在ASP.NET 4.0中,是否可以有一个返回服务器控件的函数,并能够从将服务器控件放置在呈现的HTML中的内联代码中调用该函数?

注意:以下是VB.NET,但很容易是C#等

例如,假设我有一个函数。。。

Public Function GetImageButton(ByVal id As String) As ImageButton
  Dim btn As New ImageButton
  btn.ID = id
  AddHandler btn.Click, AddressOf btn_Click
  Return btn
End Function 

我想在标记中包含以下内容。。。

<div><%=GetImageButton("btn1")%></div>

这将把服务器控件定位在HTML中的特定位置,但仍然是一个标准的ASP.NET控件,具有事件处理等功能。

然而,上述内容显然会导致以下内容被呈现为文本。。。

<div>System.Web.UI.WebControls.ImageButton</div>

我的假设是,这是不可能的,而且有必要拥有类似<asp:PlaceHolder>控件的东西,它是通过后面的代码填充的。


更新

我对这个问题有一个临时的解决办法,我已经提供了答案。

我仍然非常有兴趣听到任何其他建议/解决方案

在标记中使用函数返回的服务器控件

为了回答我自己的问题,我有以下临时解决方案。。。

根据我的假设,我正在使用<asp:PlaceHolder>并将其传递给函数(现在变成了一个子函数)。。。

Public Sub GetImageButton(ByVal plh as PlaceHolder, ByVal id As String)
  Dim btn As New ImageButton
  btn.ID = id
  ...
  plh.Controls.Add(btn)
End Sub

然后用。。。

<%GetImageButton(plh1, "btn1")%>
<asp:PlaceHolder runat="server" id="plh1" />

注意顺序很重要-Sub调用必须在<asp:PlaceHolder>控件之前,否则无法工作。我认为这是因为占位符在调用Sub之前进行渲染。