如何在自定义控件中呈现数据绑定值?

时间:2016-04-19 01:27:57

标签: c# asp.net vb.net

我将自定义控件放在现有的转发器模板中。

<ItemTemplate>
  <custom:MyControl>
    <something>
      <%# Eval("Firstname") %>
    </something>
  </custom:MyControl>
</ItemTemplate>

有没有什么方法可以以某种方式获得<%# Eval("Firstname") %>的价值而不将其作为属性添加到我的自定义控件中?

<custom:MyControl Firstname='<%# Eval("Firstname") %>' />

我有更大的需求,因为我想在<something>内定义一个完整的html结构化内部属性,在一个属性中执行此操作将是一场灾难。

所以,我的转发器是数据绑定的,显然我放在其中的控件不是数据绑定,但值可以通过属性标签传递......

我发现另一个答案说明这是不可能的,但这也是一个5岁的问题。 Eval inside an ASP.net repeater doesn't work inside another control

抓住吸管,希望找到解决方案。

2 个答案:

答案 0 :(得分:0)

您必须使用具有TemplateContainer属性的属性创建模板化用户控件。有关示例,请参阅以下文章。

Creating a Templated User Control

答案 1 :(得分:0)

我能够解决这个问题,而且我说我没有及早发现它的唯一原因是测试了每种方法的组合,但缺少每个方法的重要元素。

<ParseChildren(False)>
Public Class Something
    Inherits Button ' Just picked something

    Public Property InnerStuff() AS String

    Protected Overrides Sub OnLoad(e As EventArgs)

        EnsureChildControls()

        If HasControls() Then

            ' Interesting, if Eval() has taken place, a 
            ' DataBoundLiteralControl is created as a child
            ' control.
            If TypeOf Controls(0) Is DataBoundLiteralControl Then
                Dim instance As DataBoundLiteralControl = CType(Controls(0), DataBoundLiteralControl)
                ' I can push the text into a property
                InnerStuff = instance.Text

            ' If no databinding occurred, it creates LiteralControl
            ElseIf TypeOf Controls(0) Is LiteralControl Then
                Dim instance As LiteralControl = CType(Controls(0), LiteralControl)
                InnerStuff = instance.Text
            End If

        MyBase.OnLoad(e)

    End Sub
End Class

也许有一种更干净的方式,但这似乎有效,我的标记现在看起来像这样:

<custom:MyControl>
    Inner text, with or without <%#Eval("...")%>
</custom:MyControl>