在asp.net 4上的page_load中设置一个class属性

时间:2011-11-02 00:33:17

标签: asp.net vb.net

我正在尝试在页面加载时设置列表项的class属性。

Dim liItem As HtmlGenericControl = DirectCast(Page.FindControl("default"),          HtmlGenericControl)
    liItem.Attributes.Add("class", "active")

此代码不起作用,不太清楚为什么。 这是它产生的错误 “NullReferenceException:对象引用未设置为对象的实例”

3 个答案:

答案 0 :(得分:0)

在这种情况下,异常不会更清楚。 NullReferenceException在此指示liItem为空。这意味着在页面中没有控件称为“默认”(可能)或者DirectCast不起作用(不太可能,但也可能)。要记住的一件事是控件不可能嵌入到页面的控件集合中。

如果标记为“default”的控件包含在Panel或类似的容器控件中,则需要使用该特定控件的FindControl方法。获取控件的另一种方法是编写一个扩展方法来覆盖FindControl方法以进行递归(一种可能很重的方法)。

修改

以这种方式从母版页访问项目时,我更愿意从中进行猜测。我通常会在我的母版页中设置一个属性,该属性包含有问题的值或控件,例如:

Public Property LI_Default() As HtmlGenericControl
    Get
        Return Me.Default  ' Assumes the name specified in the question
    End Get
End Property

现在,使用母版页的页面无法立即访问,因此您必须在aspx页面内声明主类型:

<%@ MasterType VirtualPath="~/Path/To/My/Master.master" %>

通过此声明,您现在可以访问您创建的属性,并且不再需要打扰“查找”控件。

Protected Sub Page_Load(ByVal sender as Object, ByVal e as EventArgs) Handles Me.Load
    If Me.Master IsNot Nothing Then
        Me.Master.LI_Default.Attributes.Add("class", "active")
    End If
End Sub

答案 1 :(得分:0)

另一个可能的问题是“默认”控件声明(在页面中)没有ID,并且没有runat =“server”指令。必须在控件中设置这两个项目,FindControl才能找到控件。

答案 2 :(得分:0)

如果您知道控件位于母版页中,您应该这样做:

Dim liItem As HtmlGenericControl = DirectCast(Me.Master.FindControl("default"))