从内容页上的自定义控件设置MasterPage属性



我知道这个主题以前在其他线程中也讨论过,但我的问题是关于风格和OOP原则,而不是如何。我们有一种情况,我们有一个MasterPage一个Content页面和一个在Content页面中使用的自定义控件。MasterPage位于MyNamespace命名空间中,并公开了一个属性MasterTitle,我们需要从自定义控件(MyControl)中设置此属性。我们还添加了<%@MasterType VirtualPath="~/Site.Master"%>以便我们可以从内容页引用母版页。一位程序员使用了以下代码行来设置MasterTitle属性:

((MyNamespace.Site)Page.Master).MasterTitle = "Some Title";

另一位程序员做了一些更复杂的事情。在自定义控件中,他声明了一个委托:

public delegate void SetMasterTitleDelegate(string masterTitle);
public SetMasterTitleDelegate SetMasterTitle;

然后在内容页面的page_Init()中:

MyControl.SetMasterTitle = (masterTitle) => { Master.MasterTitle = masterTitle; };

在MyControl的Page_Load()事件中,设置了MasterTitle属性:

SetMasterTitle("Some Title");

我想知道完成这项任务的每种方法的优缺点,因为它与OOP原则有关。

谢谢。

有很多方法可以实现这一点。您可以在每个内容页上创建一个属性"Title",并在该属性的setter中设置母版页的标题。另一种方法是在每个内容页上实现一个接口,该接口可以用作母版页的"合同"。您可以使用一个基础来设置母版页标题,并从内容页进行设置。

但就我个人而言,我会选择(并使用)你的第一种方法。简洁明了。

但在OOP方面,我认为MS建议使用网站地图来设置标题和构建菜单/面包屑。

让我们先来谈谈这些方法:

方法1:第一种方法非常简单明了,是最不复杂的方法。它可以在没有太多开销的情况下使用结论-好方法

方法2:第二种方法似乎要复杂得多,我个人会避免它。在更大的上下文中,您开发的每个自定义控件或子页面都需要这样的方法。

我能想到的唯一另一种方法是在主页面上创建和实现一个接口,该接口具有您通常希望在主页面中引用的属性和方法。所以

public interface IMasterContract {
public string Title {get; set;}
}

然后,您可以创建一个从System继承的基类。网状物UI。页面并在基类中实现相同的接口。在这里,您可以决定是否需要将要设置的标题设置为母版页(如果存在),或者如果不存在,您可以执行任何其他操作。所以,

public abstract class AppPage : System.Web.UI.Page, IMasterContract
{
public string IMasterContract.Title {
get
{
if(this.Master!=null && this.Master is IMasterContract)
{
return ((IMasterContract)this.Master).Title;
}
else
{
//return the title from whatever control or variable you've stored it in
}
}
set
{
if(this.Master!=null && this.Master is IMasterContract)
{
((IMasterContract)this.Master).Title = value;
}
else
{
//set the title to whatever control or variable you want to stored it in
}
}
}
}

我所说的方法通常适用于可维护性是一个巨大变量的大型应用程序。可以集中进行更改,以反映整个应用程序。

对于较小的应用程序,或者如果你试图尝试的功能仅限于几个位置,我不会做我所展示的,我宁愿选择方法1。

最新更新