如何从 C# 中的代码构建 HTML
Posted
技术标签:
【中文标题】如何从 C# 中的代码构建 HTML【英文标题】:How to build HTML from Code in C# 【发布时间】:2015-07-24 13:39:04 【问题描述】:我需要在我的 MVC 应用程序中创建一个 htmlHelper,它呈现出一些嵌套且相当复杂的 UL/LI(树状)结构。 HtmlTextWriter
和 XmlTestWriter
类提供了构造正确 HTML 的方法,但它们是只向前的,因此使我的工作变得相当困难,因为在您呈现标签后,您没有对“父”标签的引用。
XDocument
和 XElement
类是我查看的下一个候选对象,但它们是为 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 脚本中捕获退出代码