1

我有一个非常简单的网站结构,一个母版页和一堆页面。母版页虽然相当先进,但我需要从页面中控制母版页的某些方面。

我希望能够在 aspx 文件中输入这些指令,以免混淆文件背后的代码。

我的想法是创建不同的“指令”用户控件,例如 SeoDirective:

using System;

public partial class includes_SeoDirective : System.Web.UI.UserControl
{

    public string Title { get; set; }

    public string MetaDescription { get; set; }

    public string MetaKeywords { get; set; } 

}

我在那些需要覆盖默认母版页设置的页面中包含此指令。

<offerta:SeoDirective runat="server" Title="About Us" MetaDescription="Helloworld"/>

在我的母版页中,我查看是否有任何指令:

includes_SeoDirective seo = (includes_SeoDirective) ContentPlaceHolder1.Controls.Children().FirstOrDefault(e => e is includes_SeoDirective);

(Children() 是一个扩展,因此我可以在 ControlCollection 上使用 Linq)

现在我的问题是:我不高兴这个解决方案可能有点臃肿?

我正在寻找可以在 aspx 文件中创建这些标签的替代解决方案。

我已经查看了扩展页面的技巧,但这需要我们修改 VS 配置以使项目编译,所以我放弃了该解决方案。

4

1 回答 1

1

据我所知,没有标准的方法来做到这一点。我过去以与您相同的方式完成了同样的事情,除了我interface在需要母版页查找的页面上使用了一个,它定义了一个可以调用的方法来对母版页执行特定的逻辑。

您也许可以使用相同的范例:

ISpecialPage.cs:

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

    string MetaDescription { get; set; }

    string MetaKeywords { get; set; } 
}

我的页面.aspx:

public partial class MyPage : System.Web.UI.Page, ISpecialPage
{
    public string Title { get; set; }

    public string MetaDescription { get; set; }

    public string MetaKeywords { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {

        this.Title = "Some title";
        this.MetaDescription  = "Some description";
        this.MetaKeywords = "Some keywords";
    }
}

MasterPage.master:

public partial class MasterPage : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (this.Context.Handler is ISpecialPage)
        {
            ISpecialPage specialPage = (ISpecialPage)this.Context.Handler;
            // Logic to read the properties from the ISpecialPage and apply them to the MasterPage here
        }
    }
}

这样您就可以处理母版页代码隐藏文件中的所有 MasterPage 逻辑,并且只需使用您需要提供某些信息的页面上的接口。

希望这对你有帮助!

于 2009-11-25T09:46:28.717 回答