【问题标题】:Use function-returned server control in mark-up在标记中使用函数返回的服务器控件
【发布时间】:2015-12-03 08:44:55
【问题描述】:

在 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>

我的假设是这是不可能的,并且有必要拥有类似 &lt;asp:PlaceHolder&gt; 控件的东西,它通过代码隐藏来填充。


更新

我有一个临时解决方案来解决我作为答案提供的问题。

我仍然很想听听任何其他建议/解决方案

【问题讨论】:

    标签: c# asp.net vb.net


    【解决方案1】:

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

    根据我的假设,我正在使用 &lt;asp:PlaceHolder&gt; 并将其传递给函数(现在变成了子函数)...

    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 调用必须在&lt;asp:PlaceHolder&gt; 控件之前,否则不起作用。我认为这是因为占位符在调用 Sub 之前呈现。

    【讨论】:

    • 这真的不输出占位符之前控件的.ToString()文本吗?即使在源代码中,如果它没有显示在浏览器中?我有点惊讶它有效,但如果有效,那就太好了:)
    • @Rob - 如果它是一个函数,并且你使用了&lt;%= %&gt;,那么是的,它会
    • Ack - 虽然当我从问题中复制函数并将其转换为 Sub 时,您让我注意到了一个错字。它不应该有返回类型,因为这显然是无效的语法
    • 啊,我的错 - 我在心理上将 sub 等同于一个函数(很长时间没有使用 VB)。那么有道理。
    • @Rob - 我羡慕你 - 不幸的是,我正在使用的遗留代码实在太大而无法转换为 C#
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    相关资源
    最近更新 更多