从asp.net中的用户控件调用基页方法

时间:2013-01-20 20:00:50

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

我一直试图找到这个问题的好答案,但似乎找不到一个。我有一个源自基页的ASP.NET页面,如下所示:

public partial class MainPage : MyBasePage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        var loginTime = GetLoginTime(); // This works fine
    }
}

基页:

public partial class MyBasePage: Page
{
}

protected DateTime GetLoginTime()
{
    // Do stuff
    return loginTime;
}

现在我在该页面上有一个用户控件需要调用我的方法......就像这样:

public partial class TimeClock : UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        var loginTime = GetLoginTime(); // This does not work!
    }
}

正如您所看到的,出于显而易见的原因,我无法调用我的基本方法。我的问题是,如何从用户控件中调用此方法?我找到的一项工作是这样的:

var page = Parent as MyBasePage;
page.GetLoginTime(); // This works IF I make GetLoginTime() a public method

如果我将我的功能公开而不是受保护,这是有效的。这样做似乎不是解决此解决方案的非常OOP方式,所以如果有人能为我提供更好的解决方案,我会很感激!

3 个答案:

答案 0 :(得分:1)

TimeClock继承自UserControl,而不是来自MyBasePage,那么为什么TimeClock会看到Method GetLoginTime()?

答案 1 :(得分:1)

你应该将你的UserControl保留在你的页面内容之外。它应该在OOP说话中解耦。添加属性以设置值和委托以挂钩事件:

public partial class TimeClock : UserControl
{
    public DateTime LoginTime{ get; set; }

    public event UserControlActionHandler ActionEvent;
    public delegate void UserControlActionHandler (object sender, EventArgs e);

    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void Button_Click(object sender, EventArgs e)
    {
       if (this.ActionEvent!= null)
       {
           this.ActionEvent(sender, e);
       }
    }

}

public partial class MainPage : MyBasePage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        var loginTime = GetLoginTime();
        TimeClock1.LoginTime = loginTime;
        TimeClock1.ActionEvent += [tab][tab]...
    }
}

答案 2 :(得分:0)

(this.Page as BasePage).MethodName()