23

我刚刚阅读了这篇关于ASP.NET MVC 3 中的Razor 模板的博文。

简而言之,我就是不明白!

也就是说,我不明白为什么我们需要这个(相当)复杂的代码来实现 IMO 可以更容易(和更整洁)完成的事情@RenderPartial

这是我不喜欢的:

  1. 模板存储为Func<T,HelperResult>委托?
  2. 该模板委托保存在控制器 ViewData 中(例如 HttpContext.Current.Items)

我从该博客中读到的唯一“好处”是模板不需要单独的文件,这意味着您不需要重新编译等。

但我不认为这是一个有效的论点。只要解决方案组织不受影响,额外的文件就可以了。

我更喜欢使用@RenderPartial,因为我可以将我的标记与主视图分开,并且我可以使用内联(渲染时间)和 jQuery(例如 AJAX 事件)来渲染它。

也许我在这里遗漏了一些东西,但是任何人都可以给出一些理由为什么我们应该选择 Razor 模板而不是 RenderPartial 来创建可重用的内容?

4

2 回答 2

19

好吧,您应该向那篇文章的作者询问他展示这种技术的动机。

它无疑说明了 Razor 中的可能性。你是否应该使用它是另一回事。我个人认为有一些不太复杂的替代技术(我同意你关于Func在请求上下文中存储 a 的观点)。

  • @RenderPartial你已经提到的。
  • 您还可以使用@helper语法(作为本地助手或全局助手)
  • 您可以编写一个 html 助手(并用于TagBuilder组装输出)
  • 你可以写一个子动作
  • 你可以写一个模板化的助手

现在我查看了上面的列表,我认为 MVC 可能提供了太多的选择 :)

更新为了更好地说明内联模板如何有用,我写了一篇关于使用它们来调用具有默认代码的部分的博客文章:Optional Razor Sections with Default Content

你可以用它来写这样的东西:

@this.RenderSection("OptionalSection", @<div>Default Content</div>) 
于 2010-12-08T04:59:32.187 回答
3

关于 Razor 的一个常见误解是它不能在 ASP.Net MVC 框架的上下文之外使用。这是最常见的情况,但剃须刀引擎的功能远不止于此。

您可以在控制台应用程序甚至库中定义剃刀模板。作为一个过于简化的示例,考虑一个向客户发送自动 HTML 电子邮件的应用程序。在过去,您要么使用字符串连接,要么使用 XSLT 转换或其他方法。无论哪种方式,您都无法直观地看到您的标记,并且操作成为维护的噩梦。

使用 Razor 模板,您可以将模板定义为 HTML 标记,您可以轻松地对其进行可视化和测试。

这是一篇展示此功能的优秀文章:http ://www.west-wind.com/weblog/posts/2010/Dec/27/Hosting-the-Razor-Engine-for-Templating-in-NonWeb-Applications

注意:我并不是说您指向的链接显示了这一点,这只是您想要超越@marcind 答案中列出的方法的一个示例。

于 2011-07-26T02:04:36.490 回答