【问题标题】:ASP.NET MVC: Using LINQ to XML to render (X)HTMLASP.NET MVC:使用 LINQ to XML 呈现 (X)HTML
【发布时间】:2009-05-06 08:20:28
【问题描述】:

关于 ASP.NET MVC 的 View-engines 进行了很多讨论,并且对带有 for 循环的内联“标签汤”之类的东西提出了一些批评。

替代或补充是使用 HTML 助手,它们只是内联方法调用。

当我今天查看 ASP.NET MVC 的 HTML 助手时,他们正在使用一个名为 TagBuilder 的类。

我的建议是使用 LINQ to XML 来获得强类型和正确格式的 (X)HTML

XDocument output = new XDocument();
XElement root = new XElement("div",
    new XAttribute("class", "root_item"));

XElement iconImage = new XElement("img",
    new XAttribute("src", ResolveUrl("~/image.gif")),
    new XAttribute("alt", "This is an image"));

XElement link = new XElement("a",
    new XAttribute("class", "link"),
    new XAttribute("href", "http://google.com"),
    new XText("Link to Google"));


root.Add(link);
root.Add(iconImage);
output.Add(root);

我喜欢它,因为它就像 WebForms 中的强类型控件,您可以在其中新建一个 Button 并将其添加到另一个控件的 Control-collection。

这有什么明显的问题或限制吗?

【问题讨论】:

  • 我个人不是 TagBuilder 的粉丝,并且在大多数情况下都求助于构建我自己的,实际上只不过是一个 string.Format()。我喜欢你的方法,但你为什么不想使用 TagBuilder?你可以用 TagBuilder 做同样的事情。

标签: asp.net asp.net-mvc linq-to-xml html-helper


【解决方案1】:

这是个好主意!我看到的唯一问题是使用 C#。 ;) VB.NET 通过它的 XML 文字特性对生成 XML 有更好的支持。

您在问题中列出的代码可以在 VB.NET 中这样编写。 (添加文本 “这是一个链接”,因为您的示例在 a 元素中不包含任何文本。)

Dim root = <div class="root_item">
               <img src=<%= ResolveUrl("~/image.gif") %> alt="This is an image"/>
               <a class="link" href="http://google.com">This is a link</a>
           </div>

仍有&lt;%= ... %&gt; 标签,但在编译时会检查它们的有效性。如果这段代码是返回类型 XElement 的函数的返回值,那么 Xhtml sn-p 可以在站点的其他地方重用。

我在 CodePlex 上有一个项目,它使用 VB.NET XML Literals 作为自定义 ASP.NET MVC 视图引擎,位于 http://vbmvc.codeplex.com。它基于Dmitry Robsman 的代码,他是 Microsoft 的 ASP.NET 产品单元经理。视图是 VB.NET 类,母版页是基类。您new-up 部分视图类,而不是通过名称字符串引用它们,因此这也是额外的编译时检查。代替返回字符串的 HtmlHelper 类,有一个返回 XElement 的 XhtmlHelper 类,其工作方式与您建议的类似。

【讨论】:

    【解决方案2】:

    我可以想到上述方法的两个问题。 首先,

    XElement iconImage = new XElement("img",
    new XAttribute("src", ResolveUrl("~/image.gif")),
    new XAttribute("alt", "This is an image"));
    

    参考你上面写的,我们可以有这样的东西:

    <img src=<%=whatever%> alt=<%=whatever%> />
    

    这可能是个人判断或什么,但我肯定会投票给后一个更“人类”可读的。是的,使用 LINQ 2 XML 可能会摆脱在我的 aspx 页面中四处游荡的奇怪 ,但同时,你会让那些“好孩子”看起来很笨拙。

    第二个可能是性能问题。我认为解析和执行 LINQ 2 XML 可能会很慢,尽管我没有这方面的任何数据。

    我个人还在尝试 MVC 框架,感觉就像回到了 ASP 或 PHP 3.X 之类的旧时代,因为几乎所有的交互部分都是显式处理的,而不是面向窗口/GUI-OOP 的 ASP Dot Net框架。我认为我将使用 MVC 的主要原因是它可以保证最优质的客户端 HTML 代码..

    【讨论】:

    • 根据我的经验,Linq to XML 的构建速度非常快——它永远不会成为您的瓶颈。如果与性能相关(假设),一般来说,字符串操作非常昂贵 - 直接使用对象构建 xml 树通常比在序列化树上执行字符串操作更便宜(请注意,具有相同名称的元素可以例如共享对该名称的相同字符串引用)。 '当然,ASP.NET 编译视图,所以它也避免了运行时解析 +string 格式...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多