我有一个每个Page类继承的抽象BasePage类。除了核心功能之外,我希望BasePage能够覆盖几乎所有派生类都实现的重复性任务。但要执行此操作,BasePage类必须保持对派生类中定义的控件(dropdownlist,gridview,menu ...)的引用。
我的问题是将派生的Page类中定义的控件引用传递给父类的最佳方法是什么?
以下所有内容都没有给出“最佳”解决方案:
声明变量的基页,其名称与派生类上的控件ID相同。这会强制ASP.NET设计者不要在派生类上重新创建控件。 (我不喜欢这个,因为派生类被迫知道并使用硬编码名称)
创建抽象属性并强制派生类返回控件引用(CON:在某些情况下,派生类可能不包含此类控件)
将控件作为函数调用参数传递(CON:仍然需要重复的函数调用代码。函数本身甚至不需要在BasePage上)
答案 0 :(得分:3)
更面向对象的方法是扩展控件类(dropdownlist,gridview,menu ...)并为重复性任务添加方法。
如果必须在BasePage中定义控件,则可以在BasePage中为这些控件创建virtual property。任何想要使用它的派生页面都会覆盖它并提供所需的控制。
public class BasePage : System.Web.UI.Page
{
protected virtual DropDownList MyDropDown { get; set; }
protected void PopulateList()
{
if (MyDropDown != null)
MyDropDown.Items.Add("option");
}
}
public partial class MyPage : BasePage
{
protected override DropDownList MyDropDown
{
get
{
return DerivedClassList;
}
set
{
base.DerivedClassList = value;
}
}
}