如何从 C# 中的代码构建 HTML

Posted

技术标签:

【中文标题】如何从 C# 中的代码构建 HTML【英文标题】:How to build HTML from Code in C# 【发布时间】:2015-07-24 13:39:04 【问题描述】:

我需要在我的 MVC 应用程序中创建一个 htmlHelper,它呈现出一些嵌套且相当复杂的 UL/LI(树状)结构。 HtmlTextWriterXmlTestWriter 类提供了构造正确 HTML 的方法,但它们是只向前的,因此使我的工作变得相当困难,因为在您呈现标签后,您没有对“父”标签的引用。

XDocumentXElement 类是我查看的下一个候选对象,但它们是为 XML 而不是为 HTML 创建的,这可能会导致 no-so-valid HTML (self -关闭标签等)。

我该怎么办?

This alleged duplicate 并不是真正的重复,根本不回答我的问题。它是关于构建一个呈现单个 Html-Tag 的 HTML-Helper。这不是我所追求的。我想知道如何用 C# 代码构建整个 DOM。

【问题讨论】:

建议您探索MVC source code - 查看 System.Web.MVC.Html 命名空间。 this answer 中显示了创建分层树结构的帮助程序示例。一般使用TagBuilder类来构造html元素。 Creating Html Helper Method - MVC Framework的可能重复 【参考方案1】:

我以前也想做类似的事情,但最后我尝试了一个对象结构,它可以表示元素,例如服务器端 DOM,可以在呈现为 HTML 之前在代码中进行操作。

其他人也做过类似的事情。值得注意的例子是 SharpDOM:http://www.codeproject.com/Articles/667581/SharpDOM-a-new-view-engine-for-ASP-NET-MVC 和 CityLizard:https://citylizard.codeplex.com/

这些天来,我倾向于构建一个视图模型来处理视图外观的大部分逻辑和操作,然后进行渲染。

您还可能会发现部分视图(递归调用)是一种有用的方法。

【讨论】:

【参考方案2】:

如果我要这样做,我会以这样的方式(简化):

物品类别

    public class HtmlListItem 
    
         public string Content  get; set; 
         public object HtmlAttributes  get; set; 
    

HTML 助手

    public HtmlString RenderList(this HtmlHelper htmlHelper, IEnumerable<HtmlListItem> list, object uListHtmlAttributes)
        
            TagBuilder ul = new Tagbuilder("ul");
            IDictionary<string, object> uListAttributes = new RouteValueDictionary(uListHtmlAttributes);
            ul.MergeAttributes(uListAttributes);
            StringBuilder builder = new StringBuilder();
            builder.Append(ul.ToString(TagRenderMode.StartTag) + Environment.NewLine);

            foreach (var item in list) 
            
                TagBuilder hold = new TagBuilder("li");
                IDictionary<string, object> htmlAttributes = new RouteValueDictionary(item.HtmlAttributes);
                hold.MergeAttributes(htmlAttributes);
                hold.InnerHtml = item.Content;
                builder.Append(hold.ToString(TagRenderMode.Normal) + Environment.NewLine);
            

            builder.Append("</ul>" + Environment.NewLine);
            return new HtmlString(builder.ToString());
        

【讨论】:

以上是关于如何从 C# 中的代码构建 HTML的主要内容,如果未能解决你的问题,请参考以下文章

如何使用C#从asp.net MVC中的枚举绑定下拉列表[重复]

如何从 C# 中的 powershell 脚本中捕获退出代码

从服务器端c#构建html

如何从 C# 中的十六进制代码中获取前景色? [复制]

如何从 C# 中的方法返回等效的 VB6 Variant 类型

在 C# 代码中的 DB 中的 Linq 查询中包含空单元格