从用户控件内的母版页中查找Literal控件,将Object引用设置为未设置为对象的实例。错误

时间:2013-10-23 15:06:48

标签: c# asp.net vb.net nullreferenceexception

我有一个母版页面,可以将用户控件加载到占位符

代码示例

placeHolderNav.Controls.Clear()
Dim ucATG As UserControl = DirectCast(LoadControl("/main/navigation.ascx"), UserControl)
ucATG.ID() = "lookJS"
placeHolderNav.Controls.Add(ucATG)

在navigation.ascx控件中,有一个ID litShowWork的文字。子页面是getwork.aspx,其中有一个方法,称为从子页面插入到该文本中

代码示例

Dim litOmniture As Literal = DirectCast(Me.Master.FindControl("lookJS").FindControl("litShowWork"), Literal)

If Not litOmniture Is Nothing Then
    litShowWork.Text &= "hello"
End If

1 个答案:

答案 0 :(得分:0)

我会在您的母版页中公开一个公共财产,例如ShowWorkTextString。此属性设置(或读取)Literal的Text。它搜索可直接访问的Placeholder中的控件。然后您的代码更易读,更易于维护。如果您决定将Literal替换为TextBox,也会更安全。您必须将页面的Master属性强制转换为主要的实际类型才能访问该属性。

由于文字位于UserControl,您应该使用相同的方法在那里公开属性。然后主人访问它而不是页面。

在主人(类型Site)中:

Public Property ShowWorkText As String
    Get
        Dim navigationControl As Navigation = Me.placeHolderNav.Controls.OfType(Of Navigation)().FirstOrDefault()
        If navigationControl IsNot Nothing Then
            Return navigationControl.ShowWorkText
        End If
        Return Nothing
    End Get
    Set(value As String)
        Dim navigationControl As Navigation = Me.placeHolderNav.Controls.OfType(Of Navigation)().FirstOrDefault()
        If navigationControl IsNot Nothing Then
            navigationControl.ShowWorkText = value
        End If
    End Set
End Property
UserControl中的

Navigation类型,LiteralShowWork是litaral):

Public Class Navigation
    Inherits System.Web.UI.UserControl

    Public Property ShowWorkText As String
        Get
            Return LiteralShowWork.Text
        End Get
        Set(value As String)
            LiteralShowWork.Text = value
        End Set
    End Property

End Class
想要设置文本的页面中的

(如上所述Site是主文件的类型):

Dim site As Site = TryCast(Me.Master, Site)
If site IsNot Nothing Then
    site.ShowWorkText = "hello"
End If