我将自定义控件放在现有的转发器模板中。
<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
抓住吸管,希望找到解决方案。
答案 0 :(得分:0)
您必须使用具有TemplateContainer
属性的属性创建模板化用户控件。有关示例,请参阅以下文章。
答案 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>