用C#代码创建HTML的最佳方法是什么?[关闭]


15

我相信标记应该保留在标记中,而不是在后面的代码中。

我遇到了一种情况,我认为可以在后面的代码中构建HTML。我想就最佳实践是什么或应该是什么达成共识。

什么时候可以在后面的代码中构建html?什么是创建此html的最佳方法?(示例:字符串,StringBuilder,HTMLWriter等)


尝试使用模板和占位符,您将在其中吐出此html标记。
Yusubov 2012年

5
另一个选择:根据数据模型生成XML,然后使用XSLT将XML转换为HTML。
FrustratedWithFormsDesigner 2012年

今天刚引起我注意的是HTML5的C#/ XAML,看起来很有希望,可能适合您的情况。cshtml5.com
softveda 2014年

XSLT路由的问题在于本地化。如果需要两种语言,则需要两个XSLT样式表并使它们保持平行。真是的 最好只是将HTML写入C#中的文本文件。使用String.Format和$“ .. {variable} ...”以及WPFLocalization吗?
埃里克(Erik)

Answers:


12

使用像剃刀这样的东西在这里不适用吗?因为如果您要使用视图引擎进行大量的html生成,则可以使其变得更加容易。它也可以在ASP.NET之外使用。

但是有时候这不是您所需要的。您是否考虑过使用.net(mvc)中的TagBuilder类?System.Web.UI中也有HtmlWriter(用于Web表单)。如果您要制作Controls或,我会推荐其中一种Html Helpers


3
+1,如果您需要在应用剃须刀内进行模板制作是必经之路。如果您需要在非asp.net应用程序中安装剃须刀的绝佳选择,请查看razorengine @ nuget.org/packages/RazorEngine
Wyatt Barnett 2012年

1
我有一个类似的要求,我需要在类库中生成html(它的负载)。我想为此使用剃刀,但很难理解如何在dll中维护cshtml文件。如何捆绑在一起?
Yashvit 2013年


14

我会使用HTML Agility Pack来组装HTML,然后将其写到文本文件中。

使Html Agility Pack健壮且符合 HTML 要求的 HTML友好型工作量很大。

我认为它甚至包括一个生成HTML的示例应用程序。

从主页:

示例应用程序:

页面修复或生成。您可以按照需要的方式来修复页面,修改DOM,添加节点,复制节点,等等。


5

我会使用htmltags创建HTML。

例:

var tag = new HtmlTag("span")
    .Text("Hello & Goodbye")
    .AddClass("important")
    .Attr("title", "Greetings")

然后CSQuery如果我想解析HTML

例:

dom.Select("div > span")
    .Eq(1)
    .Text("Change the text content of the 2nd span child of each div");

2

当然,这里有一些库,例如HTML Agility Pack,可以帮助您完成这些工作。

如果您确实不想使用现有的库,并且想要简单,简陋的代码,那么我喜欢抽象一些行为的想法,例如前面的回答所述。我也喜欢使用底层StringBuilder的想法,而不是字符串,这有几个原因:

  1. 字符串的效率不如字符串生成器
  2. StringBuilder是可索引的数据结构,

如果我不需要大规模设计的HTML引擎,则可以构建一个简单,直观的界面

AddLineBreak();
AddSimpleTag(string tagName);
AddSimpleTagAt(string tagName, string content, int index);
Output();

1
可索引的数据结构引人注目,但我不必担心效率:codinghorror.com/blog/2009/01/…–
Jim G.

1
关于字符串的沉重程度,我已经有好几次了,尤其是真正的大字符串。当它们变大时,StringBuilder的内存效率和处理器效率更高。因此,在这样的实现中,HTML可能会变得非常大,我将从StringBuilder开始。如果可以保证HTML不会变得太大,那么字符串就足够了。
蒂姆·C

1
好吧,如果HTML可以变得很大,那么我当然会推荐HTML Agility Pack。[实际上,我建议您在HTML敏捷包开始前两分钟进行操作。:)]
Jim G.

1

如果最终仅使用字符串,请不要忘记在输出数据中转义所有HTML保留字符。

&    &
>    >
<    &lt;
"    &quot;
'    &apos;

我建议使用HTML感知类或库,而不是直接使用字符串。HTMLWriter看起来是一个不错的开始。


感谢您的见解。对于可能会读的人,这就是我用来在项目模板中传递数据表的值的内容。关键是(如Mike Clark所建议的)了解HTML:<asp:Button ID =“ btnEdit” CssClass =“ btnmaatwerksmall” runat =“ server” Text =“ Wijzig” OnClientClick ='<%#String.Format(“ OpenChildInEnterprise (“ {0}”,“ {1}”,“ {2}”);”,Eval(“ Cursus”),Eval(“ Omschrijving”),Eval(“ Opmerking”))% >'/>
real_yggdrasil 2014年

-1

在原始帖子发布后将近两年-这是对我有效的解决方案。在目标文档中,放置以下内容:

<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>

1
我要指出的是,您的解决方案存在许多相同的问题,其中“内容”是不变的字符串,与该问题得分较低的帖子中所述的一样。

-1

火焰开!

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();

3
-1使用+在循环中连接字符串是最糟糕的事情。
丹尼尔·利特尔


好吧,对于初学者来说,+=在循环内使用这种方式根本无法扩展;因为字符串是不可变的,所以每次创建时都会创建一个全新的字符串。使用一个StringBuilder代替。
罗伯特·哈维

3
为什么编写可怕代码的人必须与其他人共享他们可怕的代码。
Ramhound 2012年

3
@Ramhound If you think a designer might ever have to tweak your HTML, use simple strings like this.很难理解吗?某些人对恐怖代码的定义是以花费几秒钟来完全理解来购买毫秒级性能的代码。显然,当您预期自己的代码将由个人的最低公分母查看或维护时,可以肯定地认为,写出易于理解或调整的代码总是比最干净或性能最好的代码更好。
maple_shaft
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.