2

已经有很多关于 ASP.NET MVC 的视图引擎的讨论,以及对带有 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 集合中。

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

4

2 回答 2

3

这是一个好主意!我看到的唯一问题是使用 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>

仍然有<%= ... %>标签,但在编译时会检查它们的有效性。如果此代码作为返回 XElement 类型的函数的返回值,则该 Xhtml 片段可以在站点的其他地方重用。

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

于 2009-05-22T18:40:49.183 回答
1

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

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 代码。

于 2009-05-20T12:44:35.657 回答