ASP.NET MVC Razor 视图引擎

41

在阅读完Scott Guthrie的博客关于ASP.NET MVC的新Razor 视图引擎和这个问题比较可用的视图引擎之后。

Razor似乎解决了默认视图引擎的大部分问题。哪些特性差异会让你作为开发者选择Razor?哪些特性的缺失会使你不使用它呢?


我也这么认为。但是,Razor 不能来得更快些吗? - Rei Miyasaka
6个回答

23

可进行单元测试:新的视图引擎实现将支持对视图进行单元测试(无需控制器或 Web 服务器,可以在任何单元测试项目中进行托管 - 不需要特殊的应用程序域)。

终于!!!真不敢相信 Microsoft 花了近8年时间才推出支持此功能的视图引擎。


22

视图引擎除了标记语言之外还有很多内容。以下是我会想念的一些 Spark 特性:

  • 使用相同的标记语言编写 HTML 扩展,而不是 C#(宏)——我看到 Razor 也支持此功能,希望它支持方法/参数覆盖;
  • 自定义标签(编写 _Tag.spark 以使用 <Tag />);
  • 自动生成的变量,如 varIsFirst、varIndex 等;
  • 特殊表达式形式(?{} 用于条件属性,$!{} 用于跳过错误等);
  • 良好的母版/局部布局支持,包括在局部指定应在母版中仅呈现一次的标记部分(例如脚本包含);
  • 仍然可以使用 WebForms 标记——非常适合兼容性和增量升级;
  • 支持在彼此内部使用 "" 和 '' 引号(非常有用)。

我更喜欢 Spark 的循环/条件语句语法——混合 HTML <> 和 C# {} 大括号看起来不太好看——但这纯粹是个人观点。

Razor 中也有非常有前途的特性,例如内联模板。考虑到 Spark 的创建者被微软聘用,我认为有希望 Razor 成为编写良好、非常有用和得到很好支持的视图引擎。当然,我不会用 Razor 重新编写我的数百个 Spark 视图(尽管我用 Spark 重写了几十个 WebForms 视图)。但我肯定会认真看看 Razor——我只是从你的问题中发现了这一点,谢谢——我现在看到的东西看起来很有前途。当然,它与 WebForms 不竞争(任何视图引擎都比 WebForms 好),但如果您还没有过多投资于其他视图引擎,则它似乎是一个新 ASP.NET MVC 项目的不错选择。


关于“自动生成变量” - 您可以使用John Skeet的非常聪明的“SmartEnumerable”类来在razor / webforms中实现:http://www.yoda.arachsys.com/csharp/miscutil/usage/smartenumerable.html - Simon_Weaver

15

对我而言,有三个引人注目的原因:

  1. 编译 - Razor视图可以编译为DLL。在.NET Web项目中,我们最终获得了适当的可重用性。我可以拥有一个业务对象,它知道如何显示自己,而不必将该代码作为.ascx文件漂浮在Web项目的某个部分。

  2. 可测试性 - 由于Razor视图被编译为类,因此我可以编写单元测试并将模拟的对象实例传递给它,以查看HTML是否正确。

  3. 智能感知简洁语法很好,但不是最重要的部分。


你的项目要点中提到的“编译”有更多信息吗?也许有链接可以分享吗?非常感谢。 - Buildstarted
是的,在ScottGu关于Razor的博客文章的评论中提到了对类库的支持计划: http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx#7553475引用: “关于ASP.NET的新视图引擎“Razor”的介绍2010年7月3日星期六,下午12:14,ScottGu @Chris,
1)这些可以预编译或作为资源嵌入到程序集中吗?
是的-这是我们计划中的一项未在帖子中提及的功能。我们计划让你能够将它们添加到类库项目并将其编译为程序集。 ... ScottGu”
- Quango
啊,难怪我没看到它...他的帖子上总是有数百万条评论。 :) 谢谢 - Buildstarted
更新:有几篇不错的博客文章介绍如何在 ASP.NET 项目之外创建 Razor 视图: http://blog.andrewnurse.net/2010/07/22/UsingTheRazorParserOutsideOfASPNet.aspx - Quango
预编译在rc1中尚不可用,但可以自己创建一些东西。我刚刚在博客中写了关于这个的内容:http://goo.gl/KffWq - Chris van de Steeg

4
显然我还没有实际评估过它,但它比ASPX引擎更简洁的事实是最具说服力的功能,可以诱使我进行切换。 我只希望它也能够自动更好地格式化。它将得到Intellisense支持并与MVC一起交付,这使其成为启动新项目的自然选择。在切换之前,我将在一个小项目上公正地尝试它。仅从阅读文章,我没有看到任何我无法使用它来做我目前正在使用ASPX引擎所做的事情。
更新:我已经使用Razor超过一年了,再也不会回到ASPX引擎。 语法非常自然和富有表现力。

你是否考虑过使用Spark?请查看queen3的回答,了解Spark提供的其他功能列表。 - Ryan
1
不幸的是,Spark Intellisense支持不太好(尤其是在VS2010中),这可能会成为许多开发人员的绊脚石。但是支持正在开发中,希望事情会得到改善。 - queen3
1
我觉得,如果在视图中需要使用智能感知,则表明该视图过于复杂。尽管我的大部分视图内容看起来像是!{Html.EditTemplateFor(x => x.Quantity)},因此我只需要知道一些关键帮助方法和视图模型上的属性即可。我认为缺乏智能感知实际上帮助我保持了简单性。 - Ryan

0
除了更清晰的外观,布局部分的灵活性看起来非常好,声明式 HTML 助手也非常有用。到目前为止,我没有看到使用它的任何缺点,但当然还需要在实践中尝试一下。

0

Razor使用括号,即对于foreach等内容。 Spark在这里使用XML标签。

因此,Spark完全支持通过XML处理器解析和分析视图文件。

也许这不是一个大问题,但显示了一致性和可扩展性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接