我有一些基本上看起来像这样的代码:
<div>
<% if(Something) { %>
<div id="someUniqueMarkup">
This markup should not be output if Something==true.
<units:MyUserControl runat="server"/>
</div>
<% }
else { %>
<units:MyUserControl runat="server" />
<% } %>
</div>
取决于Something
,其中一个是隐藏的,这很好。但是如果我在用户控件中设置断点,我会注意到它被加载了两次(对于上面的每个控件都加载了一次)并且它的所有逻辑都运行了两次。我当然可以使用占位符或多视图来控制它,但同样的事情似乎适用 - OnLoad
/ Page_Load
等对于页面上实际存在的每个控件都运行一次。
修改
我显示/隐藏这个的原因是因为我需要在控件周围包含一些标记Something == true
。我可以在控件之前和之后的if-else中包装“unique markup”本身,但这对于真正应该像我上面想象的那样简单的东西来说似乎很脏。在这两种情况下,用户控件本身应该完全相同,不好意思是它具有令人困惑的属性。
只是我,还是这只是一个非常不直观的界面?实际上,只要页面上有用户控件就可以不加载/执行用户控件吗?
答案 0 :(得分:39)
由于页面上有两个控件,因此它们都会呈现它们。您创建的if-check仅确定它是否包含在输出中。防止这种情况的最简单方法是更改您的代码:
<div>
<units:MyUserControl runat="server" SomeSetting="<%= Something %>" />
</div>
编辑:在原帖中回答编辑:
<div>
<% if(Something) { %>
<div id="someUniqueMarkup">
This markup should not be output if Something==true.
<asp:placeholder id="phItemInDiv" runat="server" />
</div>
<% }
else { %>
<asp:placeholder id="phItemOutsideDiv" runat="server" />
<% } %>
</div>
MyUserControl ctrl = (MyUserControl)LoadControl("/pathtousercontrol.ascx")
if (something){
phItemInDiv.Controls.Add(ctrl);
}
else{
phItemOutsideDiv.Controls.Add(ctrl);
}
这样,如果Something
为真,您将只发出(并加载)用户控件
答案 1 :(得分:1)
在我看来,最好的方法是在ASPX中声明一次用户控件。
在后面的代码中,在PageLoad上,应用您认为合适的逻辑:
if(something)
MyUserControl.SomeSettings = ...
如果年表中存在问题,请在PreLoad中执行上述逻辑,因为它将在页面的页面加载及其所有相关用户控件之前触发。
修改强>
您可以使用Enabled = false在用户控件上放置两个不同的ID。 在Page_load中,根据您想要的逻辑将Enabled设置为其中一个。