这段代码会被视为不良做法:
<div id="sidebar">
<% =DisplayMeetings(12) %>
</div>
这是我工作过的一个小型网络应用的default.aspx代码片段。它运行得非常好,运行速度非常快,但一如既往,我知道只是因为它有效,并不意味着它没问题。
基本上,DisplayMeetings子程序输出一堆格式化的HTML(实际上是无序列表),没有格式化,只需要必要的html,然后我的CSS执行所有必要的格式化。
用于生成列表的数据来自SQL服务器数据库(该参数控制要返回的行数),我使用存储过程和datareader进行快速访问。这使我的前端非常简单,干净,imho,让我在一个单独的模块中用VB或C#完成所有工作。
我当然可以使用数据中继转发器(可能还有6种或更多其他方法)来完成同样的事情,但它们会更好吗?除了失去VS2010的设计时功能?
答案 0 :(得分:2)
您的方法唯一“错误”是它混合了代码和显示,您通常希望尽可能避免。如果你必须有一个程序生成的HTML部分(因为它只是很难用控件或其他),创建一个控件来负责生成该HTML并将其嵌入包含它的较大页面/控件中。
是“错误的”部分,子程序是返回HTML,还是我在HTML标记中执行了代码片段?
两者都在某种程度上。也没有。
使用<%= foo %>
没有任何直接“错误”;如果有,它将不是框架的一部分。它的“错误”在于它设置了一个你不一定想要的双向依赖。您的HTML标记依赖于并且必须了解代码隐藏。它必须调用该方法,而该方法又专用于标记而不是其他任何方法。如果要更改输出,可能必须更改方法,标记或两者。
我想说的是,你正在做的事情使你的代码不易维护,下次打开引擎盖时修改的灵活性会降低。
如果这是解决问题的唯一方法,那么这是唯一的方法,而且没有任何问题。但是,如果可能的话,这应该是应该避免的。
我怎么做?坦率地说,这取决于具体情况。如果我可以使用带有数据绑定的标准组件,我就已经这样做了。这总是首选。如果HTML太复杂而无法使用组件,我会使用Literal控件作为标记的占位符,并在单独的组件中生成标记 - 可能是用户控件。
重点是标记对用于生成其他标记的方法一无所知,它只是说“有什么东西在这里”并且依赖于它的代码隐藏来处理决定放在那里的标记。
答案 1 :(得分:2)
这不是我要做的事情。我不喜欢在Webforms中使用<%= %>
。可悲的是,这也是常见的做法。
我可能会做的是构建一个用户控件来表示我想要的标记并将其放在表单上。这样做的好处是可以使元素更易于重用,可测试,并且可以让您更好地控制调用代码的页面生命周期。
答案 2 :(得分:0)
当您需要更改布局时,数据绑定转发器可以使修改您的html更简单一些。如果你有独立的人在html上工作,那么你也可以使用服务器端代码。
我通常的规则是使用转发器来处理任何稍微复杂的html。我不会从我的aspx / ascx文件中调用方法 - 我只插入我在代码中填充的受保护字符串变量的值。然而,这些都是个人偏好,我认为你所做的事情没有任何问题。
你的代码(没有看到它)可能比转发器更快,因为不涉及数据绑定,但除非页面非常非常受欢迎,否则它可能不是一件大事。