在我的ASP.NET Codebehind中使用StringBuilder编写HTML是一个好习惯吗?
我很想听听其他开发人员对我通常采用的方法的看法。 我有一个web应用程序,asp.net 2.0,c#。
我通常用来编写下拉列表,表格,输入控件等等,在使用StringBuilder后面的代码中写出类似sb.Append(“
我发现自己并没有使用很多.net控件,因为我通常会在后面的代码中写出html。 当我想使用jQuery或调用JavaScript时,我只是将该函数调用放在我的sb.Append标记中,如sb.Append(“td … onblur =’fnCallJS()’。
我对这种方法非常满意。 对于数据访问,我使用EntitySpaces。
我有点好奇,如果这种方法是非常错误的,可以根据上下文,好,时间学习3.0等等。我对学习感兴趣,只是在寻找一些意见。
编辑
看完这里的评论后,听起来我应该看看MVC。 我还没有那样做。 这样做的唯一犹豫是现有项目就是现有项目。 有很多代码已经按照我解释的方式完成,很难想象改变它的原因,这样做的好处,以及只需要学习所需要的东西。
我从评论中得到的另一件事是我的代码背后应该不包含很多sb.Append代码,而现在它已经在很多函数中填充了它。 对我而言,它并不凌乱,但那是因为我知道每个函数的作用,并且可以查看它,看看哦,写出x,y和z。
我在.aspx部分只有一个div然后用后面的代码中的StringBuilder构建.innerHtml并不罕见。
再次感谢您的评论。 我在想,因为我在读它们。
我通常在后面的代码中写出html。
那部分有点奇怪,而不是我推荐给webforms的东西。 如果你想这样做,请考虑使用asp.net mvc项目。
在webforms中,你真的希望你的html的内容与标记而不是代码一起使用。 两者应保持分开。 您也不需要包含整个页面的巨大字符串构建器。 这将强制您将整个页面保留在内存中两次 (一次用于stringbuilder字节,一次用于结束时构建的字符串),而不是在构建时将页面写入响应流。 这意味着每个请求有更多内存,这实际上可以扼杀可伸缩性。
为此,我将您的stringbuilder代码的不同部分抽象为可在aspx标记中使用的自定义/用户控件。 这些控件可以使用stringbuilder来创建输出。 这意味着您只需要在内存中保留足够的html标记,以便一次渲染一个控件。 它还允许您更轻松地跨页面甚至站点重复使用常见标记。
有时您需要在代码中生成一些HTML,但一般情况下,您希望将HTML保留在它所属的位置,并将其与代码分开。 VS IDE是一个非常好的HTML编辑器。 用它。
我打算走出困境,猜测你可能来自“经典”ASP(vbScript)或PHP背景。
我的背景是“经典ASP”,我对Webforms模型的第一次尝试几乎和你的一样,一旦我开始使用它们并理解它们我就再也没有回头了。 虽然在理解页面生命周期如何与各种WebForm控件交互时有一个明显的学习曲线。
查看ASP.net WebForms与MCV上的各种线程,看看哪些项目最适合您的项目。 MVC不是一个神奇的治疗方法,但如果你来自“经典ASP”或PHP背景,那么在许多方面可能会更加熟悉。
从实际角度来看,假设您坚持使用WebForms,如果其他开发人员有可能参与该项目,您的目标是在可能的地方使用更多内置控件,因为这很可能是他们熟悉的内容。 。 说明显而易见的是,您使用控件的次数越多,您就越熟悉他们可以做什么和不能做什么,在不久之前,您会发现自己编写自己的控件来填补空白或找到现有的第三方控件。
你有一个很大的问题,它可能变得非常混乱……不得不逃避所有“或搞乱回车。当然你可以编程,但如果你想复制/粘贴代码怎么办?听起来像一场噩梦和更多的工作而不是它的价值。
听起来你应该编写一个自定义控件并使用HtmlTextWriter来编写标记。
或者更合适的是用户控件,在aspx页面中有标记,后面是代码中的任何其他内容。
如果您正在使用此方法,则应将开发工作迁移到ASP.Net MVC。 ASP.Net主动尝试通过使用Web控件来抽象HTML,CSS,JavaScript等,而ASP.Net MVC是围绕直接控制标记本身的范例构建的(尽管可能是最不同的区别)这两个 – 你应该读它至少知道其他选择,即使从长远来看你坚持使用ASP.Net)。
否则,如果正确完成你正在做的事情(尽管你将全程地对抗框架),尽管我建议使用StringWriter 。 它在内部使用StringBuilder,因此两者之间的性能特征相同,但语义与.Net框架的其余部分更加一致(例如,Write vs. Append)。
我认为这种方法有点击败了webforms试图完成的目的(分离标记和代码)。
我知道这个post有点陈旧,并且得到了很好的回答,我只是觉得我会“追加”(双关语)我的回答,因为我正在处理问题中提到的代码。
所有标记都在C#类中,它们创建了一个StringBuilder对象来附加所有的html和JavaScript字符串。 这使得阅读代码并查看正在发生的事情非常困难,以及如果他们想要更改前端的标记/设计会怎么样? 现在,我已经掌握了一些工作,不得不进入并重构类中的所有标记,这时更改.aspx页面并将数据模型连接到这些页面会更容易。
在我看来,我找不到一个很好的理由在你的课程/代码中加入任何标记。 它们仅用于逻辑。 此外,它使测试和调试Javascript变得困难。 那是我的两分钱。 K.