2009-12-11 28 views
1

我试图让参考驻留在从我的.aspx.cs我的.aspx的用户控制,但是当我试图获得参考它的空一个<ul>获取参考用户控件的对象

所以这在我的.ascx:

<ul id="notificationsList" runat="server"></ul> 

在我.asxp我有给该用户控件的引用:

<pmc:MyControl id="myControlReference" runat="server" EnableViewState="false" /> 

和其中使用用户控件在.aspx页面的代码隐藏我:

HtmlGenericControl notificationListControl = MyControlReference.FindControl("notificationList") as HtmlGenericControl; 

notificationListControl结束retrning空,我想不通为什么它不能找到这个或如何从我的.aspx页面中的用户控件获取它。

+0

runat =“server”使它成为一个服务器控件。 – 2009-12-11 20:10:52

+0

因为它有一个runat =“服务器”,这使得它成为一个服务器控件。 – PositiveGuy 2009-12-11 20:11:00

回答

2

不知道,如果是这样的话,但你必须在你的代码一个错字:

HtmlGenericControl notificationListControl = 
    MyControlReference.FindControl("notificationList") as HtmlGenericControl; 

难道不应该是“通知小号目录”?

+0

+1,不错的猜测=) – 2009-12-11 20:08:52

+2

哦好神,wtf。尴尬。我忽略了一些如此简单的东西...猜我需要更加注重细节 – PositiveGuy 2009-12-11 20:14:27

+0

+1那些补丁魔法字符串 – Perpetualcoder 2009-12-11 20:17:13

0

你应该知道FindControl不看整个控件树,但只是第一级,即只考虑直接的子控件(没有盛大的孩子控件)

所以,你可以:

  • 要构建一个递归FindControl实现
  • 为了揭露一个属性,你UserControl访问您的UL直接
1

如果你想揭露它,你可以暴露控制的用户控件的属性:

public class MyUserControl : UserControl 
{ 
    public SomeControlType NotificationList 
    { 
     get { return this.notificationList; } 
    } 
} 

然后在ASPX的代码隐藏,你可以直接访问它:

//if your usercontrol reference/variable is 'myUserControl' 
myUserControl.NotificationList 

一般来说,您可能只想在UserControl中公开功能而不是嵌套控件。你想保持你的UserControl尽可能独立和自给自足。也许在UserControl上暴露一个方法,允许您指示控件在通知列表上执行一些操作。从那里实现UserControl本身内部的“如何”操作。假设您正在公布通知列表以简单清除其值或更新这些值。该用户控件本身应为此事负责,所以你可以这样做:它

public class MyUserControl : UserControl 
{ 
    public void ClearNotificationList() 
    { 
     this.notificationList.Clear(); 
    } 

    public void UpdateNotificationList(string newNotification) 
    { 
     this.notificationList.Add(newNotification); 
    } 
} 

这样的想法 - 如果你正在执行中对用户控件的直接嵌套控制aspx页面的动作,它违背了可重用性的目的的UserControl,因为你必须在其他aspx页面中做同样的事情。上面的例子是指在你重新使用控制任何aspx页面,你可以这样做:

myControlReference.ClearNotificationList(); 
myControlReference.UpdateNotificationList("some value"); 

你的aspx页面并不需要知道用户控件“如何”完成上述可知,只有预期的结果。如果您需要更新UserControl的工作方式,只需编辑一个类/文件,而不是可能多的aspx文件。

希望这有助于...