2

我最近试图向程序员解释为什么在 ASP.Net 中他们应该创建 HTMLControls 而不是创建 HTML 字符串来创建网页。

我知道这是一种更好的做事方式,但除了“这种方式更好”之外,我真的无法给出具体的理由。

如果让你回答这个问题,你的答案是什么?

为什么是

将 divA 调暗为 New HtmlControls.HtmlGenericControl("div")
将 ulList1 调暗为新 HtmlControls.HtmlGenericControl("ul")
将 liObj1、liObj2、liObj3 调暗为 New HtmlControls.HtmlGenericControl("li")
liObj1.innerText = "列表项目 1"
liObj2.innerText = "列表项 2"
liObj3.innerText = "列表项 3"
ulList1.Controls.Add(liObj1)
ulList1.Controls.Add(liObj2)
ulList1.Controls.add(liObj3)
divA.Controls.add(ulList1)

“更好”比:

Dim strHTML as String
strHTML = "<div><ul><li>List item 1</li><li>List item 2</li><li>List item 3</li></ul></div>"

? 它看起来并不好。看看所有的代码!而且,这是一个非常简单的示例,以节省空间。我认为我实际上不会像那样手动创建列表,而是会遍历集合或使用更高级的 Web 控件,但我试图说明一点。

4

7 回答 7

2

我也不做。相反,我:

  1. 创建一个封装所需构造的自定义控件
  2. 或(非常相似)创建一个具有我想要的属性的简单类并覆盖该.ToString()方法以创建所需的 HTML。

但是在您的两个选择中,前者更好的几个原因是:

  • 您可以在页面生命周期的后期更改 html 控件的属性或将其他控件添加到树中
  • ASP.Net 负责呈现 html。保证您不会有任何可能破坏 xhtml 合规性的错误。
于 2008-12-10T17:19:04.177 回答
2

一大优势:将 HTML 编写为字符串非常容易出现人为错误,并且有可能很快变得不可读和难以管理。

生成的 HTML 将受到更好的保护,并且可以自我记录。

(作为记录,我鄙视这两种方法,并使用 XSLT 作为我的模板)

于 2008-12-10T17:23:11.157 回答
1

您可能更喜欢大多数现代 Web 开发框架提供的模板系统。我不确定可用于 ASP 的选项,但肯定有一些。使用模板系统可以避免在代码中放置任何标记或编写详细的文档构造块,就像您在问题中提供的两个示例一样。

尝试使用谷歌搜索“asp.net 模板模板”作为开始的地方。如果 asp.net 有如下页面,那就太好了。如果您找到了,请告诉我们:

http://wiki.python.org/moin/Templating

于 2008-12-10T17:57:41.870 回答
0

只有在两种情况下才真正更好:

  1. 您需要对代码中的这些控件做一些事情
  2. 生成的手动 HTML 非常混乱,以字符串形式维护是不切实际的。

从代码的角度来看,两者都不是更好的解决方案。就显示而言,它们都工作得很好。

于 2008-12-10T17:13:16.030 回答
0

就个人而言,我只会在必要时创建控件,因为很多 Microsoft 的 HTML 只能在怪癖模式下工作,而且我同意创建 HTML 字符串很容易出错。

我使用 XML 解析器创建 XHTML,然后从 XMLDocument 对象中获取 .toString。它很冗长,但输出格式始终正确,并且始终有效。

于 2008-12-11T01:01:21.937 回答
0

好处是 ASP.NET 生成的代码在不同条件下呈现不同。浏览器版本、软件更新/补丁、趋势、额外的框架等。当您自己编写 HTML 并将其转储到屏幕上时,它永远不会改变。它永远是你写它的样子。

但是,如果您使用 .NET 对象(推荐的方式)添加它,最终用户浏览器中呈现的实际代码是在运行时创建的。一个很好的例子是使用“用于 ASP.NET 2.0 的 CSS 控件适配器工具包”,它改变了 .NET 控件的呈现方式,将呈现控件的默认方法更改为使用纯 CSS。

于 2008-12-24T03:37:29.740 回答
-1

像你一样构建控件是 ASP.NET 最糟糕的事情。MVC 或带有 Partials 的方法是构造 HTML 的更好(更容易维护)的方法。

于 2010-08-02T05:53:30.540 回答