主机页面 - 用户控制通信ASP.NET

时间:2009-03-09 17:36:02

标签: c# asp.net user-controls

我有很多用户控件。用户控件可以在不同的页面上使用。用户控件的行为根据它们使用的页面而有所不同。

如何在所有用户控件可以访问的主页上设置参数?

3 个答案:

答案 0 :(得分:2)

您的描述“用户控件的行为根据其使用的页面而有所不同”表示设计缺陷。 ASP.NET中的控件模型是围绕encapsulationOOP设计的,这意味着控件应该与其周围的上下文无关。你应该重新考虑你的设计。

话说回来,完全有可能(警告 - 不良做法)在页面上设置控件可以读取的公共属性:

class MyPage : Page
{
    public string MyProperty;
}

class MyUserControl : UserControl
{
    void Page_Load(object sender, EventArgs e)
    {
        ((MyPage)this.Page).MyProperty //casts Page as the specific page
    }
}

答案 1 :(得分:0)

我同意雷克斯的观点,我对此要求表示怀疑。

那就是说,我觉得将它放在HttpContext.Current.Items集合上会更清晰。页面将优先在其OnInit上设置值,使用包围它的漂亮类来获取信息。

如果你想要你可以让包装器实际读取当前的Url,或检查页面的类型(通常是当前的Handler HttpContext.Current.Handler /不记得如果ajax影响那个),这可以为您提供一个不需要页面设置任何内容的解决方案。

答案 2 :(得分:0)

正如Rex M所说,出于多种原因,这是不好的做法。如果我发现我需要从控件引用父页面,我会将对页面的引用传递给控件,​​而不是让控件引用父控件。

我可能会考虑创建一个所有这些页面都可以实现的接口并将其传递给控件。界面将保证类型安全。如果您开始在新页面上使用此控件,那么该页面需要先实现该界面,然后才能将其与控件一起使用。这将有助于你在新页面上抛出控件并忘记控件与父关系有这种关系的情况(这种关系可能很脆弱,这是不是没有的原因之一)。