【问题标题】:Is it a Good Practice to Write HTML Using a StringBuilder in my ASP.NET Codebehind?在我的 ASP.NET 代码隐藏中使用 StringBuilder 编写 HTML 是一种好习惯吗?
【发布时间】:2017-10-05 02:56:00
【问题描述】:

我很想听听其他开发人员对我通常采用的方法的看法。我有一个 web 应用程序,asp.net 2.0,c#。

我通常写下拉列表、表格、输入控件等的方法是在使用 StringBuilder 的代码中并写出类似 sb.Append("

我发现自己没有使用很多 .net 控件,因为我通常在后面的代码中写出 html。当我想使用 jQuery 或调用 JavaScript 时,我只需将该函数调用放在我的 sb.Append 标记中,例如 sb.Append("td...onblur='fnCallJS()'。

我对这种方法已经很熟悉了。对于数据访问,我使用 EntitySpaces。

我只是有点好奇这种方法是否严重错误,取决于上下文,好,是时候学习 3.0 等等。我对学习很感兴趣,只是在寻找一些输入。


编辑

读完这里的 cmets 之后,听起来我应该看看 MVC。我还没有这样做。这样做的唯一犹豫是现有项目就是这样,现有的。有很多代码已经按照我解释的方式完成了,很难想象改变它会涉及什么,这样做的好处,以及只是学习需要什么。

我从 cmets 中得到的另一件事是,我背后的代码实际上不应该包含很多 sb.Append 代码,而现在它在许多函数中都填充了它。对我来说这并不混乱,但那是因为我知道每个函数的作用,并且可以查看它并查看,哦,它会写出 x、y 和 z。

我经常在 .aspx 部分有一个 div,然后在后面的代码中使用 StringBuilder 构建它的 .innerHtml。

再次感谢 cmets。我边读边想。

【问题讨论】:

  • 我建议你看看 MVC。

标签: c# asp.net stringbuilder


【解决方案1】:

我通常在后面的代码中写出html。

这部分有点奇怪,我不推荐用于网络表单。如果您想这样做,请考虑使用 asp.net mvc 项目。

在网络表单中,您确实希望 html 的内容与标记而不是代码一起使用。两者应保持分开。您也不想要一个包含整个页面的巨大字符串生成器。这将迫使您将整个页面保存在内存中两次(一次用于 stringbuilder 字节,一次用于最后构建的字符串),而不是在构建页面时将页面写入响应流。这意味着每个请求需要更多的内存,这真的会扼杀可扩展性。

为此,我会将您的 stringbuilder 代码的不同部分抽象为您可以在 aspx 标记中使用的自定义/用户控件。这些控件可以使用字符串生成器来创建它们的输出。这意味着您只需要在内存中保留足够的 html 标记即可一次呈现一个控件。它还允许您更轻松地跨页面甚至站点重用通用标记。

【讨论】:

  • 好的。我想知道在 3.0 中说诸如 之类的东西有什么好处。通过使用 StringBuilder 写出东西,我几乎可以做任何我需要的事情。我没有遇到过很多我觉得我需要一些方法无法做到的情况。
  • 我也不推荐在 3.0 中使用 List,原因相同:它会将所有内容同时拉入内存。请改用更精简的 IEnumerable,因为您可以使用它一次仅在内存中保留一个元素。
【解决方案2】:

有时您需要在代码中生成一些 HTML,但一般来说,您希望将 HTML 保留在它所属的位置,并且与您的代码分开。 VS IDE 是一个非常好的 HTML 编辑器。使用它。

【讨论】:

    【解决方案3】:

    我会冒昧地猜测您可能来自“经典”ASP (vbScript) 或 PHP 背景。

    我的背景是“经典 ASP”,我对 Webforms 模型的第一次尝试与你的几乎相同,一旦我开始使用它们并理解它们,我就再也没有回头。尽管在理解页面生命周期如何与各种 WebForm 控件交互方面存在明显的学习曲线。

    查看 ASP.net WebForms 与 MCV 上的各种线程,看看哪个最适合您的项目需要。 MVC 不是万灵药,但如果您来自“经典 ASP”或 PHP 背景,在许多方面可能会更熟悉。

    从实际的角度来看,假设您坚持使用 WebForms,如果其他开发人员有可能参与到项目中,您的目标是尽可能使用更多的内置控件,因为这很可能是他们会做的熟悉。很明显,您使用控件的次数越多,您就会越熟悉它们能做什么和不能做什么,不久之后您会发现自己编写自己的控件来填补空白或找到现有的第 3 方控件。

    【讨论】:

      【解决方案4】:

      你遇到的一个大问题是它可能会变得非常混乱......不得不转义所有 " 或弄乱回车符。当然你可以编程解决这个问题,但是如果你想复制/粘贴代码怎么办?听起来像一场噩梦,而且工作量远远超过它的价值。

      【讨论】:

      • 是的,有时刻度线可能会有点棘手,但一段时间后您就会熟悉,这似乎没什么大不了的。我可以接受这种方法。我只是发现自己没有使用 .net 控件并问自己,这对吗?不确定我是否走错了路,但就像我说的那样。有用。我读了一些 3.0 的东西,但我并没有像 等那样做很多事情。我真的没有需要。
      【解决方案5】:

      听起来您应该编写自定义控件并使用 HtmlTextWriter 编写标记。

      或者更合适的是用户控件,在 aspx 页面中带有标记,在后面的代码中包含任何其他内容。

      【讨论】:

        【解决方案6】:

        如果您使用这种方法,您应该将您的开发工作迁移到 ASP.Net MVC。 ASP.Net 积极尝试通过使用 Web 控件来抽象 HTML、CSS、JavaScript 等,而 ASP.Net MVC 是围绕直接控制标记本身的范式构建的(尽管这可能是两者之间最小的差异)这两个 - 你绝对应该阅读它至少知道替代方案,即使你长期坚持使用 ASP.Net)。

        否则,如果做得好,你正在做的事情会起作用(尽管你会一直与框架作斗争),但我建议改用StringWriter。它在内部使用 StringBuilder,因此两者的性能特征相同,但语义与 .Net 框架的其余部分更一致(例如,Write vs. Append)。

        【讨论】:

          【解决方案7】:

          我认为这种方法有点违背网络表单试图实现的目的(分离标记和代码)。

          【讨论】:

          • 我认为你是对的。听起来很奇怪。这是我真正知道如何进行 Web 表单开发的唯一方法。我知道,很奇怪,但这就是我学习它的方式,只是有点坚持。现在我有一个充满这种方法的大项目,所以......
          • @d3020 我给你的一点建议是不要陷入“我会继续这样做以与已有的内容保持一致”的陷阱。我已经多次陷入这个陷阱。始终使用新代码进行改进,并在可以一点一点地更新旧代码时。
          • 我同意伙计——至少在我的脑海里我同意。这实际上是我伸手在这里问的原因。但就像我说的,我现在不知道 MVC 是否真的是正确的选择。我很确定我至少需要开始将事情进一步分离到可能的类中——我现在没有。我发现有时在不同的页面上重复说某个功能的代码。我可能会从我的数据访问和 StringBuilder 的东西中分离出来,而现在我只需调用 EntitySpaces 选择并在我后面的代码中的一个函数中循环所有内容。
          【解决方案8】:

          我知道这个帖子有点老了,并且得到了很好的回答,我只是想我会“附加”(双关语)我的答案,因为我正在使用问题中提到的代码。

          所有标记都在 C# 类中,他们创建了一个 StringBuilder 对象来附加所有 html 和 JavaScript 字符串。这使得阅读代码并查看发生了什么变得非常困难,如果他们想更改前端的标记/设计怎么办?现在,我手头上的工作很重,必须进入并重构类中的所有标记,而更改 .aspx 页面并将数据模型连接到这些页面会容易得多。

          以我的拙见,我找不到在您的类/代码中添加任何标记的充分理由。它们仅用于逻辑。另外,它使测试和调试 Javascript 变得困难。那是我的两分钱。 K.

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-03-21
            • 1970-01-01
            • 2010-12-24
            • 2017-09-18
            • 2012-05-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多