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






2.77/5 (8投票s)
使用接口将参数从母版页传递给用户控件的简单方法。
引言
很久以前,我专注于从模板生成页面的问题。我目前正在进行的项目的一部分需要动态加载一些用户控件。用户控件的设计是为了适应不同的模板,因此它们必须尽可能通用,所以我必须将参数传递给它们。在本文中,我将尝试解释一种更好更简单的方法,用于将参数传递给母版页中的用户控件。
总体思路
我的想法是使用一个 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
}
结果
这是结果……我知道使用的颜色不是最好的,但请原谅我,这是一个演示应用程序,所以只有核心计数!
摘要
我希望这篇文章对您有所帮助。 当我需要开发它时,我花了三天时间试图弄清楚如何基于不同的母版页生成动态插槽。 另一件事:如果这篇文章缺少您可能需要知道的某些内容,请原谅我。 现在,这些事情对我来说很熟悉,但也许您需要进一步的帮助。 请随时与我联系。