我正在寻找一个从ASP中删除内容的优雅解决方案。如果未设置数据,则显示网页。让我再解释一下。
我在一个页面上有一些数据块,其中包含一些带有单独值的小节。如果没有为其中一个值设置数据,我需要隐藏它(这样它就不会占用空间)。此外,如果子节中没有设置任何值,则也需要将其隐藏。最后,如果块/面板中没有可见的子部分,那么我需要隐藏整个部分。
使用嵌套面板/DIVs 实现布局
<Panel id="block">
<Panel id="sub1">
<Panel id="value1-1">blah</Panel>
<Panel id="value1-2">blah</Panel>
</Panel>
<Panel id="sub2">
<Panel id="value2-1">blah</Panel>
<Panel id="value2-2">blah</Panel>
</Panel>
</panel>
我想知道是否有人能在不写一堆嵌套的if的情况下实现这样的东西。。Else语句,而不创建一堆自定义控件。无论我实现什么,都需要足够健壮,以处理标记中的更改,而无需不断地操纵代码绑定。
我希望有一种方法可以通过一些简单的标记更改(自定义属性)和对PageLoad或PreRender的递归函数调用来实现这一点。
非常感谢您的帮助。
编辑:
好的,所以让这件事变得棘手的是,在子部分中可能有其他控件没有考虑到控件的隐藏和显示。每个值面板中可能都有控件,这些控件不考虑是否显示。示例:
<Panel id="sub2">
<Image id="someImage" src="img.png" />
<Panel id="value2-1">
<Label>blah</Label>
<TextBox id="txtValue" />
</Panel>
<Panel id="value2-2">blah</Panel>
</Panel>
这是一个过于简化的例子,但离我所担心的不远了。
如果您可以编写函数为每个组返回true/false,则可以避免递归遍历,例如
<Panel id="block" runat="server" visible="<%=IsBlockVisible%>">
<Panel id="sub1" runat="server" visible="<%=IsSubVisible(1)%>">
<Panel id="value1-1">blah</Panel>
<Panel id="value1-2">blah</Panel>
</Panel>
<Panel id="sub2" runat="server" visible="<%=IsSubVisible(2)%>">
<Panel id="value2-1">blah</Panel>
<Panel id="value2-2">blah</Panel>
</Panel>
</panel>
使用递归。按节点第一顺序遍历控制树。根据控制值酌情使用节点的可见属性。如果父级设置为不可见,则不要访问子级
我认为您使用递归是正确的。但我会远离自定义属性——坚持标准。您真正需要的只是通过递归方法在每个面板上设置Visible属性。
如果您有一个严格的层次结构块/子/值,并且数据来自数据库,我建议使用嵌套的中继器和返回3个结果集的存储过程
我认为我们需要更多地了解您试图实现的目标,以便从一开始就确定这是否是正确的方法。