如果是aspx文件中的语句

时间:2013-05-29 08:31:58

标签: c# asp.net webforms

我有一些基本上看起来像这样的代码:

<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”本身,但这对于真正应该像我上面想象的那样简单的东西来说似乎很脏。在这两种情况下,用户控件本身应该完全相同,不好意思是它具有令人困惑的属性。

只是我,还是这只是一个非常不直观的界面?实际上,只要页面上有用户控件就可以不加载/执行用户控件吗?

2 个答案:

答案 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设置为其中一个。