【发布时间】:2014-05-06 12:37:18
【问题描述】:
这让我感到困惑,因为当它不是回发时,相同的 FindControl 代码会找到控件。情况是这样的。
我有一个自定义控件 (ClassCell.ascx)。它有一个 LoginView,它只为特定角色的人显示一个链接。
...
<asp:LoginView ID="LoginView1" runat="server">
<RoleGroups>
<asp:RoleGroup Roles="Instructor">
<ContentTemplate>
<a id="btnEdit" class="cssButtonPink" runat="server" href="">Edit</a>
</ContentTemplate>
</asp:RoleGroup>
</RoleGroups>
</asp:LoginView>
...
所以链接被称为“btnEdit”。
我的自定义控件有一个名为 SetClass 的方法,我在其中使用 FindControl 查找“btnEdit”控件,然后设置其 href 应指向的内容。
Public Sub SetClass
...
Dim editButton As HtmlAnchor = Me.LoginView1.FindControl("btnEdit")
If editButton IsNot Nothing Then
editButton.HRef = "~/Instructors/ManageClasses.aspx?c=" + ClassID.ToString
End If
...
End Sub
我在我的 Signup.aspx 页面的 PreRender 阶段动态添加我的自定义控件,然后立即调用它的 SetClass 方法。
Private Sub ClassSignup_PreRender(sender As Object, e As System.EventArgs) Handles Me.PreRender
...
If IsPostBack Then
...
Else
...
End If
...
' this is where my misbehaving control is (indirectly) created '
Dim cc As New ClassCell
cc = LoadControl("~\Members\ClassCell.ascx")
cc.SetClass(objClass)
...
End Sub
为什么是间接的?它实际上有点复杂,因为有几个嵌套的自定义控件。但是所有的动作都发生在我指出的 PreRender 中。我创建了一个 RoomTable 自定义控件。在其中,创建了 ScheduleRow 自定义控件,并且在 ScheduleRow 的方法中创建了 CellClass 控件。我不确定这种嵌套是否重要。
当它不是 postBack 时,这在初始页面加载中非常有效。但是主页上还有一个按钮,您可以在其中前进到下一周或上一周。这就是回发的来源。当我在回发中逐步执行上述代码时,我看到 FindControl 返回 Nothing。我还看到 LoginView1.Controls.Count = 0,所以这似乎不仅仅是通过控件层次结构递归的问题。我不明白为什么回发时没有控件。
更奇怪的是,“编辑按钮”实际呈现,但超链接未激活,因为我的代码未能设置它,因为找不到控件。所以这几乎就像是一个时间问题,当我尝试使用它时,控件不在那里,但稍后会在那里。 PreRender 是否是尝试这样做的错误时机?
提前感谢您的帮助。我希望我只是缺少一些简单的东西。 桑德拉
【问题讨论】:
-
什么时候调用 FindControl ?如果它在 PreRender 之前(您添加按钮的位置),那么它不会找到它,因为它还没有被实例化。
-
你需要重新绑定它才能重新渲染。
-
@Sandra 你能改一下ASP.Net HyperLink服务器控件再测试一下吗?
-
@Michael - 希望我的编辑澄清。这一切都在 PreRender 期间进行。
-
@MMK - 这个建议听起来很有希望。但是你能澄清你所说的重新绑定是什么意思吗?它不是绑定控件。
标签: asp.net postback findcontrol loginview