Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# aspx文件中的If语句_C#_Asp.net_Webforms - Fatal编程技术网

C# aspx文件中的If语句

C# aspx文件中的If语句,c#,asp.net,webforms,C#,Asp.net,Webforms,我有一些代码基本上如下所示: <div> <units:MyUserControl runat="server" SomeSetting="<%= Something %>" /> </div> 如果Something==true,则不应输出此标记。 根据内容的不同,其中一个是隐藏的,这很好。但是如果我在用户控件中设置断点,我会注意到它被加载了两次(上面每个控件一次),并且它的所有逻辑都被运行了两次。当然,我可以使用占位符或多视图来控

我有一些代码基本上如下所示:

<div>
    <units:MyUserControl runat="server" SomeSetting="<%= Something %>" />
</div>

如果Something==true,则不应输出此标记。
根据
内容的不同
,其中一个是隐藏的,这很好。但是如果我在用户控件中设置断点,我会注意到它被加载了两次(上面每个控件一次),并且它的所有逻辑都被运行了两次。当然,我可以使用占位符或多视图来控制这一点,但同样的事情似乎也适用于-
OnLoad
/
Page\u Load
etc对页面上的每个控件运行一次

编辑: 我之所以显示/隐藏它,是因为如果
Something==true
,我需要在控件周围包含一些标记。我可以在控件前后用if-else将“惟一标记”本身包装起来,但这似乎有点脏,因为它应该像我上面想象的那样简单。在这两种情况下,用户控件本身应该完全相同,很抱歉它有令人困惑的属性


只是我,还是这只是一个非常不直观的界面?而且,只要用户控件在页面上,实际上是否可能根本不加载/执行它?

因为页面上有两个控件,它将同时呈现这两个控件。您创建的if检查仅确定是否包含在输出中。防止这种情况的最简单方法是如下更改代码:

<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==true,则不应输出此标记。
MyUserControl ctrl=(MyUserControl)LoadControl(“/pathtousercontrol.ascx”)
如果(某物){
phItemInDiv.Controls.Add(ctrl);
}
否则{
phItemOutsideDiv.Controls.Add(ctrl);
}

这样,只有当
某个东西是真的时,才会发出(并加载)用户控件

在我看来,最好的方法是在ASPX中声明一次用户控件

在代码隐藏中的PageLoad上,应用您认为合适的逻辑:

if(something)
    MyUserControl.SomeSettings = ...
如果年表中有问题,请在PreLoad中执行上述逻辑,因为它将在页面及其所有相关用户控件的页面加载之前触发

编辑:

您可以在用户控件上放置两个不同的ID,并将Enabled=false。
在Page_load中,根据您想要的逻辑将Enabled设置为其中一个。

我知道,但是在用户控件周围有很多内容是不应该显示的。将更新原来的帖子来澄清这一点。简单但有效,我喜欢现在的编辑。
SomeSetting
属性根本不是我的重点,它只是为了使它们之间的差别更大-\基本点保持不变,如果将用户控件放在页面上,它将完全执行其生命周期。我编辑我的答案是为了告诉你如何防止这种情况。(注意:如果您需要编辑usercontrol的属性,您需要将
LoadControl
的结果强制转换到您的usercontrol,设置属性,然后将其添加到占位符中。但是我的基本观点仍然是一样的:对于使用ASP.NET的程序员来说,这只是一个不直观的界面:-)使用
LoadControl
在codebehind中有条件地加载控件实际上似乎是我真正想要的解决方案,除此之外,它真的很脏(对用户控件的字符串引用)。我想只有你一个人。为什么不使用codebehind呢?您的控件是服务器端的,所以在添加ID参数时,您可以设置您的设置。只使用一次,正如肯尼思在他的回答中提到的那样。in·tu·i·tive/inˈt(y)o͞oitiv/形容词使用或基于一个人认为真实的东西,即使没有意识的推理;本能的。(主要指计算机软件)易于使用和理解。我不是一个“骗子”——这不是直觉。哪种编程语言即使条件为false也会执行if语句中的某些内容?答:在这个例子中,除了WebForms之外,几乎没有任何代码。@GrantThomas即使在块“未执行”的情况下,也会执行块内的代码,这一点如果你问我的话,是很不直观的。事实上,我不同意。或者,这是一个笼统的概括。但这是真的。整个页面生命周期有多直观?外接程序数据绑定和数据绑定事件。还有那些肮脏的、生成的designer.cs文件。这一切是如何直觉的?如果不知道Webforms是如何工作的,任何人都无法理解这些东西,而大多数其他框架通常都可以通过了解所使用的语言和主要模式来理解。请参见编辑,我删除了
SomeSetting
属性,因为它不是我试图表达的观点的一部分。