我相信标记应该保留在标记中,而不是在后面的代码中。
我遇到了一种情况,我认为可以在后面的代码中构建HTML。我想就最佳实践是什么或应该是什么达成共识。
什么时候可以在后面的代码中构建html?什么是创建此html的最佳方法?(示例:字符串,StringBuilder,HTMLWriter等)
我相信标记应该保留在标记中,而不是在后面的代码中。
我遇到了一种情况,我认为可以在后面的代码中构建HTML。我想就最佳实践是什么或应该是什么达成共识。
什么时候可以在后面的代码中构建html?什么是创建此html的最佳方法?(示例:字符串,StringBuilder,HTMLWriter等)
Answers:
使用像剃刀这样的东西在这里不适用吗?因为如果您要使用视图引擎进行大量的html生成,则可以使其变得更加容易。它也可以在ASP.NET之外使用。
但是有时候这不是您所需要的。您是否考虑过使用.net(mvc)中的TagBuilder类?System.Web.UI中也有HtmlWriter(用于Web表单)。如果您要制作Controls
或,我会推荐其中一种Html Helpers
。
我会使用HTML Agility Pack来组装HTML,然后将其写到文本文件中。
使Html Agility Pack健壮且符合 HTML 要求的 HTML友好型工作量很大。
我认为它甚至包括一个生成HTML的示例应用程序。
从主页:
示例应用程序:
页面修复或生成。您可以按照需要的方式来修复页面,修改DOM,添加节点,复制节点,等等。
当然,这里有一些库,例如HTML Agility Pack,可以帮助您完成这些工作。
如果您确实不想使用现有的库,并且想要简单,简陋的代码,那么我喜欢抽象一些行为的想法,例如前面的回答所述。我也喜欢使用底层StringBuilder的想法,而不是字符串,这有几个原因:
如果我不需要大规模设计的HTML引擎,则可以构建一个简单,直观的界面
AddLineBreak();
AddSimpleTag(string tagName);
AddSimpleTagAt(string tagName, string content, int index);
Output();
如果最终仅使用字符串,请不要忘记在输出数据中转义所有HTML保留字符。
& &
> >
< <
" "
' '
我建议使用HTML感知类或库,而不是直接使用字符串。HTMLWriter看起来是一个不错的开始。
在原始帖子发布后将近两年-这是对我有效的解决方案。在目标文档中,放置以下内容:
<table>
<%:theHtmlTableMomToldYouAbout() %> //# Where I want my rows of table data to go
</table>
被调用的函数如下所示:
public HtmlString theHtmlTableMomToldYouAbout()
{
string content = "";
HtmlString theEnvelopePlease = null;
for (int i = 0; i < 5; i++)
{
content = content + "<tr><td>The Number Is: " + i + "</td></tr>";
}
theEnvelopePlease = new HtmlString(content);
return theEnvelopePlease;
}
浏览器中的输出结果与预期的一样:
数字为:0
数字为:1
数字为:2
数字为:3
数字为:4
当我查看源代码时,会发现以下内容:
<table>
<tr><td>The Number Is: 0</td></tr>
<tr><td>The Number Is: 1</td></tr>
<tr><td>The Number Is: 2</td></tr>
<tr><td>The Number Is: 3</td></tr>
<tr><td>The Number Is: 4</td></tr>
</table>
火焰开!
var html = "";
html += "<table class='colorful'>";
foreach(var item in collection) {
html += "<tr>";
html += "<td class='boldCell'>" + item.PropWhatever + "</td>";
// more cells here as needed
html += "</tr>";
}
html += "</table>";
placeholder1.InnerHtml = html;
我可能对此不满意,但作为一名前设计师,在我对.NET不太了解之前,不得不对HTML进行代码调整,因此与抽象HTML创建方法相比,上述代码更容易理解。如果您认为设计师可能不得不调整HTML,请使用这样的简单字符串。
我看到许多开发人员在用代码编写HTML时会错过的一点是,在HTML中,属性允许使用单引号或双引号。因此,与其转义代码中的所有引号(对于未启动的代码看起来有些诡异),只需对字符串中的html引号使用单引号。
精细。串接仇恨者的所有字符串都使我的代表拥挤不堪。这是不使用字符串串联的“正确”方法,但是我坚持认为,带有普通表的任何普通页面都不会在类似于Google的可笑规模之外出现任何性能问题:
var sb = new System.Text.StringBuilder();
sb.Append("<table class='colorful'>");
foreach (var item in collection)
{
sb.Append("<tr>");
sb.Append("<td class='boldCell'>" + item.PropWhatever + "</td>");
// more cells here as needed
sb.Append("</tr>");
}
sb.Append("</table>");
placeholder1.InnerHtml = sb.ToString();
+=
在循环内使用这种方式根本无法扩展;因为字符串是不可变的,所以每次创建时都会创建一个全新的字符串。使用一个StringBuilder
代替。
If you think a designer might ever have to tweak your HTML, use simple strings like this.
很难理解吗?某些人对恐怖代码的定义是以花费几秒钟来完全理解来购买毫秒级性能的代码。显然,当您预期自己的代码将由个人的最低公分母查看或维护时,可以肯定地认为,写出易于理解或调整的代码总是比最干净或性能最好的代码更好。