从子用户控件访问基本用户控件属性

时间:2011-11-30 20:00:42

标签: c# asp.net dynamic user-controls inheritance

我的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; }
    }
}

2 个答案:

答案 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]?

如果在派生类中有新的关键字或覆盖,并且只有基类中的值可能是罪魁祸首。这件事发生在我之前。