2010-04-02 79 views
5

我有一个C#/ ASP.NET .aspx页面,声明两个控件,每个控件都代表一个选项卡的内容。我想要一个查询字符串参数(例如?tab = 1)来确定哪两个控件被激活。我的问题是,它们都会经历初始化事件并填充它们的子控件,浪费CPU资源并减慢响应时间。是否有可能以某种方式停用它们,以便它们不经过任何初始化?如何声明C#Web用户控件但停止初始化?

我的.aspx页面中看起来是这样的:

<% if (TabId == 0) 
    { %> 
<my:usercontroltabone id="ctrl1" runat="server" /> 
<% } 
    else if (TabId == 1) 
    { %> 
<my:usercontroltabtwo id="ctrl2" runat="server" /> 
<% } %> 

而这部分工作正常。我认为<%的意思是控制不会实际上被宣布,所以不会初始化,但事实并非如此...

回答

7

如果内联/意大利面条服务器端代码没有帮助,我只能想到一种替代解决方案:避免在标记中声明控件。相反,从您的Page_Init事件处理程序加载您实际上想要在页面上的控件。 Page.LoadControl()方法可用于此:

void Page_Init(object sender, System.EventArgs e) 
{ 
    Control tab; 

    switch (TabId) 
    { 
     case 0: tab = LoadControl("usercontroltabone.ascx"); break; 
     case 1: tab = LoadControl("usercontroltabtwo.ascx"); break; 
     default: tab = LoadControl("defaulttab.ascx"); break; 
    } 

    somePlaceholder.Controls.Add(tab); 
} 
+0

我同意意大利面代码需要去。逻辑应该保留在代码隐藏中,以保持面向对象的东西。 – Daniel 2010-04-02 14:42:14

+0

这种方式的效果很好,警告是如果你依赖于视图状态。 Viewstate不会自动加载到动态添加的控件上。 – 2010-04-02 14:44:41

+0

@Chuck:如果我的记忆为我提供了正确的服务(这已经有一段时间了,因为我使用Web表单进行了很多工作),这实际上取决于加载控件时的*。我相信加载'Page_Init'而不是'Page_Load'可以解决(大部分)视图状态问题。 – 2010-04-02 14:50:20

1

将初始化代码移出.Load,您自己的自定义公共方法,并在适当时明确地调用启动器。

0

在代码隐藏中应用您的逻辑。

声明控件:

<my:usercontroltabtwo id="ctrl2" Visible="False" runat="server" /> 

,然后设置可见性:

if(TabId == 0) 
{ 
ctrl1.Visible = true; 
} 
else if(TabId == 1) 
{ 

ctrl2.Visible = true; 
} 
+2

这不会帮助。 – SLaks 2010-04-02 14:41:29

+0

@Chuck:基本上我在做什么,但是ctrl1和ctrl2(以及他们的所有子控件)都获得了启动事件,这正是我试图避免的。 – 2010-04-02 14:51:02

+0

添加到SLaks的评论:这种方法只会导致控件不会渲染*,但它仍然会被加载到控制树中并初始化。基本上,这是OP已经拥有的。 – 2010-04-02 14:52:45

0

UserControl.dispose()方法停止用户控件Page_Load事件触发。

+0

这不适合我。我似乎打乱了我的页面。 – 2017-03-02 18:56:02