aspx 文件中的 if 语句
Posted
技术标签:
【中文标题】aspx 文件中的 if 语句【英文标题】:If statements in aspx files 【发布时间】:2013-05-24 10:13:15 【问题描述】:我有一些基本上看起来像这样的代码:
<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 中,但这对于真正应该像我上面想象的那样简单的东西来说似乎很脏。用户控件本身在这两种情况下应该完全相同,抱歉它有令人困惑的属性。
只是我,还是这只是一个非常不直观的界面?只要它在页面上,实际上是否可以根本不加载/执行用户控件?
【问题讨论】:
我想只有你。 为什么不使用代码隐藏?您的控件是服务器端的,因此在添加它们的 ID 参数时,您可以设置您的设置。并且只使用一次,正如@Kenneth 在他的回答中提到的那样。 in·tu·i·tive /inˈt(y)o͞oitiv/ 形容词 使用或基于即使没有有意识的推理而感觉真实的事物;本能的。 (计算机软件首席)易于使用和理解。我不是“骗子”——这不直观。即使条件为假,哪种编程语言也会在 if 语句中执行某些操作?答:在这个例子中,除了 WebForms 之外,几乎没有。 @GrantThomas 如果你问我,即使块“未执行”,块内的代码也会被执行。 我实际上不同意。或者,这是一个笼统的概括。但这是真的。整个页面生命周期有多直观?添加数据绑定和数据绑定事件。还有那些肮脏的、生成的 Designer.cs 文件。这一切如何直观?如果不了解 Webforms 的工作原理,任何人都无法理解这些东西,而大多数其他框架通常可以通过了解所使用的语言和主要模式来理解。 【参考方案1】:由于您在页面上有两个控件,它将同时呈现它们。您创建的 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
为真,您将只发出(并加载)用户控件
【讨论】:
我知道,但是有很多东西不应该显示在用户控件周围。将更新原始帖子以澄清这一点。 简单有效,我喜欢 立即查看编辑。SomeSetting
属性根本不是我的意思,它只是为了在它们之间产生更大的差异而添加的。 :-\
基本点还是一样的,如果你把用户控件放在页面上,它会完全执行它的生命周期。我编辑了我的答案,向您展示如何防止这种情况。 (注意:如果您需要编辑用户控件的属性,您需要将LoadControl
的结果转换为您的用户控件,设置属性然后将其添加到占位符
很公平。但是我的基本观点也是一样的:对于使用 ASP.NET 的程序员来说,这只是一个不直观的界面 :-) 使用LoadControl
有条件地在代码隐藏中加载控件实际上似乎是我真正想要的解决方案,除此之外它真的脏(对用户控件的字符串引用)。【参考方案2】:
在我看来,最好的方法是在 ASPX 中声明一次用户控件。
在后面的代码中,在 PageLoad 上,应用您认为合适的逻辑:
if(something)
MyUserControl.SomeSettings = ...
如果年表出现问题,请在 PreLoad 中执行上述逻辑,因为它将在页面及其所有相关用户控件的页面加载之前触发。
编辑:
您可以在启用 = false 的用户控件上放置两个不同的 ID。 在 Page_load 中,根据您想要的逻辑将 Enabled 设置为其中之一。
【讨论】:
查看编辑,我删除了SomeSetting
属性,因为它并不是我想要表达的重点。以上是关于aspx 文件中的 if 语句的主要内容,如果未能解决你的问题,请参考以下文章