从ASCX用户控件调用另一控件属性时出现Null引用异常
问题分析与解决:ASCX控件调用属性时的“对象引用未设置”异常
问题根源
你在Page_Load中直接通过New GridTableUserControl()创建控件实例,这种方式没有让控件进入ASP.NET的页面生命周期流程,导致控件内部的服务器控件(hf_MaxPocketNumber这个HiddenField)未被正确初始化,处于null状态。当你访问它的Value属性时,自然会抛出「对象引用未设置到对象实例」异常。
解决方案
1. 使用页面上已声明的控件实例
如果GridTableUserControl已经在当前ASCX的页面标记中声明(比如<uc1:GridTableUserControl ID="pocketControl" runat="server" />),直接使用这个已声明的实例:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim abc As Integer = pocketControl.Max_Pocket_Value_ End Sub
2. 动态加载控件并加入控件树
如果需要动态创建控件,必须用LoadControl方法加载,并且将其添加到页面的某个容器控件(比如Panel)中,确保生命周期正常执行:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim pocketControl As GridTableUserControl = CType(LoadControl("~/Path/To/GridTableUserControl.ascx"), GridTableUserControl) YourPanel.Controls.Add(pocketControl) ' 替换成你页面上的容器控件ID Dim abc As Integer = pocketControl.Max_Pocket_Value_ End Sub
3. 防御性代码优化
另外,在控件的属性Max_Pocket_Value_中,可以添加对hf_MaxPocketNumber的null检查,避免异常:
Public Property Max_Pocket_Value_() As Integer Get Dim MAXIMUM_VALUE As Integer = -1 ' 默认值 Try If Me.hf_MaxPocketNumber IsNot Nothing Then Integer.TryParse(Me.hf_MaxPocketNumber.Value, MAXIMUM_VALUE) If MAXIMUM_VALUE < 0 Then MAXIMUM_VALUE = -1 End If End If Catch ex As Exception ' Web环境不要用MsgBox,改用日志或前端提示 System.Web.HttpContext.Current.Trace.Warn("Max_Pocket_Value_异常", ex.Message) ' 或者用ScriptManager弹出前端提示 ' ScriptManager.RegisterStartupScript(Me, Me.GetType(), "ErrorMsg", "alert('加载失败:" & ex.Message.Replace("'", "\'") & "');", True) End Try Return MAXIMUM_VALUE End Get Set(max_Pocket_Number As Integer) If Me.hf_MaxPocketNumber IsNot Nothing Then hf_MaxPocketNumber.Value = max_Pocket_Number.ToString() End If End Set End Property
内容的提问来源于stack exchange,提问作者Douglas
相关产品推荐
相关产品推荐

