我的asp.net应用程序有一个自定义的基本用户控件,它继承自其他用户控件。此自定义基本用户控件具有三个已公开的属性。加载用户控件时,自定义基本用户控件属性为null。我想弄清楚我做错了什么。请有人帮忙弄清楚我错过了哪一步?
自定义基本用户控件从父页面加载代码:
private void Render_Modules()
{
foreach (OnlineSystemPageCustom.OnlineSystemPageHdr.OnlineSystemPageModule item in custompage.Header.Modules)
{
if (item.ModuleCustomOrder != 99)
{
webonlinecustombase ctl = (webonlinecustombase)Page.LoadControl("../IPAM_Controls/webtemplatecontrols/webonlinecustombase.ascx");
ctl.Event = Event;
ctl.custompage = custompage;
ctl.custommodule = item;
this.eventprogrammodules.Controls.Add(ctl);
}
}
}
自定义基本用户控制代码
public partial class webonlinecustombase : System.Web.UI.UserControl
{
public Event Event { get; set; }
public OnlineSystemPageCustom custompage { get; set; }
public OnlineSystemPageCustom.OnlineSystemPageHdr.OnlineSystemPageModule custommodule { get; set; }
public void Page_Load(object sender, EventArgs e)
{
string typeName = custommodule.ModuleInternetFile;
inpagelink.HRef = "#" + custommodule.ModuleName.Replace(" ", "").Replace("/", "");
modtitle.InnerText = custommodule.ModuleName;
Type child = Type.GetType(typeName);
UserControl ctl = (UserControl)Page.LoadControl(child, null);
if (ctl != null)
{
this.modsection.Controls.Add(ctl);
}
}
}
继承基本用户控件的用户控件的示例代码
public partial class eventscientificoverview : webonlinecustombase
{
protected void Page_Load(object sender, EventArgs e)
{
if (custommodule.ModuleDefaultVerbiage != null && custommodule.ModuleDefaultVerbiage != "") { this.Load_Verbiage(false); }
else if (custommodule.ModuleCustomVerbiage != null && custommodule.ModuleCustomVerbiage != "") { this.Load_Verbiage(true); }
}
protected void Load_Verbiage(bool usecustom)
{
if (usecustom) { this.scientificoverviewverbiage.InnerHtml = custommodule.ModuleCustomVerbiage; }
else { this.scientificoverviewverbiage.InnerHtml = custommodule.ModuleDefaultVerbiage; }
}
}
答案 0 :(得分:1)
您必须在父页面的init事件中调用Render_Modules。
此外,您可能希望重新构建基本/自定义类以避免事件执行顺序混淆,因为将在基本类和自定义类中触发加载事件。
每当我们有这种类型的结构时,我们总是在基类中实现一个OnLoad方法,以便继承者重写。这样我们就可以准确地控制何时在继承者中执行Load逻辑。
更新了其他信息
以下是有关如何处理基类和子类中的加载事件的一些其他信息。
在webonlinecustombase中,添加以下内容:
protected virtual void OnPageLoad() {
}
然后修改您的页面加载事件以在适当的时间调用此新方法:
public void Page_Load(object sender, EventArgs e)
{
string typeName = custommodule.ModuleInternetFile;
inpagelink.HRef = "#" + custommodule.ModuleName.Replace(" ", "").Replace("/", "");
modtitle.InnerText = custommodule.ModuleName;
Type child = Type.GetType(typeName);
UserControl ctl = (UserControl)Page.LoadControl(child, null);
if (ctl != null)
{
this.modsection.Controls.Add(ctl);
}
// Now let the inheritors execute their code
OnPageLoad();
}
然后,在您继承的类中,更改:
protected void Page_Load(object sender, EventArgs e)
到
protected override void OnPageLoad()
在我查看此代码时,我发现您还在webonlinecustombase中动态加载控件。您需要将控件的加载移动到init事件中,以便它们在标准页面逻辑中正常工作。
答案 1 :(得分:0)
您是否尝试过基地。[PropertyName]?
如果在派生类中有新的关键字或覆盖,并且只有基类中的值可能是罪魁祸首。这件事发生在我之前。