65.9K
CodeProject 正在变化。 阅读更多。
Home

将参数传递给母版页的用户控件

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.77/5 (8投票s)

2008年11月6日

CPOL

2分钟阅读

viewsIcon

84102

downloadIcon

552

使用接口将参数从母版页传递给用户控件的简单方法。

引言

很久以前,我专注于从模板生成页面的问题。我目前正在进行的项目的一部分需要动态加载一些用户控件。用户控件的设计是为了适应不同的模板,因此它们必须尽可能通用,所以我必须将参数传递给它们。在本文中,我将尝试解释一种更好更简单的方法,用于将参数传递给母版页中的用户控件。

总体思路

我的想法是使用一个 ASPX 页面,将其分配给一个母版页,并通过编程方式加载控件。结果是,我有一个相当大的页面,因为它应该包含将参数传递给每个模板的 ASCX 所需的所有检查。我大量使用了

Control c = Page.LoadControl("~/UserControls/Usercontrol1.ascx");
((ICommonUserControl) c).SetValue1 = "somevalue";

这很有用,但是使 ASPX 页面加载器变得很大……今天,我发现了另一种方法,稍后我会向您解释……但首先,让我们看一下 ASP.NET 页面生命周期 [^].

" PreInit -> Init -> InitComplete -> PreLoad -> Load -> LoadComplete -> PreRender -> SaveStateComplete -> Render -> Unload"。

由于母版页只能通过编程方式在 PreInit 中设置,因此这是我们的设置和加载将发生的地方。

动态设置母版页

正如我告诉你的,母版页可以在 PreInit 中设置,这是代码 (我同时也留空了 Page_Load 以向您展示它是如何使用的)。

protected void Page_PreInit(object sender, EventArgs e)
{
    Page.MasterPageFile = "~/SomeTemplate.Master";
    ((ITemplateManupulation)Page.Master).SetValueName(7);
}

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

Web 控件如何读取模板页的数据

正如您之前看到的,我们将 "value" 属性设置为 7,并且我们希望用户控件读取它……这真的很简单……看一看。

public partial class DisplayNumberUserControl : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        int i = ((ITemplateManupulation) this.Page.Master).GetValueName();
        lblNumber.Text = i.ToString();
    }
}

同样,我使用接口来访问母版页中设置的属性。

接口

使用接口访问属性而不将它们强制转换为特定页面类型(考虑 200 个不同母版页的场景!)非常简单。

public interface ITemplateManupulation
{
    void SetValueName(int i);
    int GetValueName();
}

母版页 - 第 1 部分

如您所见,即使在这里,事情也很简单……如果您不熟悉,只需记下 DisplayNumberUserControl 和文件顶部的注册即可。

母版页 - 第 2 部分

这是全部的代码后置……在这个演示中真的很简单。

public partial class SomeTemplate : System.Web.UI.MasterPage, ITemplateManupulation
{
    public int Value { get; set; }

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

    #region Implementation of ITemplateManupulation

    public void SetValueName(int i)
    {
        Value = i;
    }

    public int GetValueName()
    {
        return Value;
    }

    #endregion
}

结果

这是结果……我知道使用的颜色不是最好的,但请原谅我,这是一个演示应用程序,所以只有核心计数!

Result.jpg

摘要

我希望这篇文章对您有所帮助。 当我需要开发它时,我花了三天时间试图弄清楚如何基于不同的母版页生成动态插槽。 另一件事:如果这篇文章缺少您可能需要知道的某些内容,请原谅我。 现在,这些事情对我来说很熟悉,但也许您需要进一步的帮助。 请随时与我联系。

© . All rights reserved.