我有一些 webusercontrols “.ascx”,并希望将一些代码放入 App_Code 文件夹中的函数类中,但是当我尝试此代码时,我不断收到“对象引用未设置为对象的实例”。
public static void Layout()
{
Page pg = (Page)HttpContext.Current.Handler;
PlaceHolder PH = (PlaceHolder)pg.FindControl("PHolder");
}
我有一些 webusercontrols “.ascx”,并希望将一些代码放入 App_Code 文件夹中的函数类中,但是当我尝试此代码时,我不断收到“对象引用未设置为对象的实例”。
public static void Layout()
{
Page pg = (Page)HttpContext.Current.Handler;
PlaceHolder PH = (PlaceHolder)pg.FindControl("PHolder");
}
不太确定这是否有帮助,但我有一个 ascx,它在 aspx 页面中调用一个函数,该函数可以满足我的需要。
//ascx
protected void btnSave_Click(object sender, EventArgs e)
{
((aspxpage)this.Page).functionName();
}
//aspx
public void functionName()
{
//Call function in app_code class
}
如果您得到 null 而不是异常,那么这意味着Page
正在正确评估。但是,可能不是
PlaceHolder PH = (PlaceHolder)pg.FindControl("PHolder");
PHolder 控件实际上不太可能属于该页面。该控件很可能属于某个子控件。该FindControl()
方法不是递归函数。它只会在直接属于它的控件集合中查找。为了使它工作,您需要传入实际的父控件,您希望在其中找到此 PHolder 或重载/扩展 System.Web.UI.Page 中的 FindControl 方法(或您的基类,如果您正在使用一个)是递归的。不过要小心这种方法,因为页面可能有很多控件,而且这种递归可能会非常繁重。
如果 PHolder 控件在您的所有页面中都是通用的,那么将一个属性放在一个基类中,该基类包含对该 PHolder 对象的引用并以这种方式访问它,这可能不是一个坏主意。