ASP.NET MVC 3 Razor模板 vs RenderPartial

23

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

简单地说,我就是没明白!

也就是说,我不明白为什么我们需要这个(相当)复杂的代码来实现使用@RenderPartial可以更容易(更整洁)实现的功能?

以下是我不喜欢的:

  1. 模板被存储为一个Func<T,HelperResult>委托?
  2. 该模板委托被持久化在控制器的ViewData中(比如HttpContext.Current.Items)

从那篇博客中唯一的“好处”是,不需要为模板编写单独的文件,这意味着您不需要重新编译等操作。

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

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

也许我在这里漏掉了什么,但是有人可以给出一些选择Razor模板而不是RenderPartial来创建可重用内容的原因吗?

2个回答

19

你应该问那篇文章的作者他为什么介绍这种技术。

它确实展示了在 Razor 中所能实现的,但你是否应该使用它则是另一回事。我个人认为有其他的技巧可以做到更简单(我同意你对将 Func 存储在请求上下文中的观点)。

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

看着上面的列表,我想 MVC 可能提供了太多的选择 :)

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

你可以使用它来编写类似于这样的代码:

@this.RenderSection("OptionalSection", @<div>Default Content</div>) 

哈哈哈。自由思想是敌人。感谢@marcind。:) +1 - RPM1984
出于好奇(只是因为您在MVC团队),您是否知道包含Razor模板的动机是什么?肯定存在某种需求/商业案例。还是只是提供像您所说的另一种选择? - RPM1984
2
我们(MVC团队)并没有提供“Razor模板”。这只是Imran写的一篇博客文章。我们并不是说你应该以这种方式编写应用程序。只是因为Razor的工作方式,所以有可能这样做。 - marcind
1
啊,不知道呢。谢谢,我会坚持使用我熟悉的技术。 - RPM1984

3
常见的误解是Razor引擎不能在ASP.Net MVC框架之外使用。尽管这是最常见的情况,但是Razor引擎的功能远不止于此。
您可以在控制台应用程序或库中定义Razor模板。作为一个简单的例子,考虑一个向客户发送自动化HTML电子邮件的应用程序。以前,您要么退而求其次使用字符串拼接或XSLT转换或其他方法。无论哪种方式,您都无法直观地查看您的标记,并且操作变得难以维护。
有了Razor模板,您可以将模板定义为HTML标记,从而可以轻松可视化和测试它。
以下是一篇优秀的文章,演示了这种能力:http://www.west-wind.com/weblog/posts/2010/Dec/27/Hosting-the-Razor-Engine-for-Templating-in-NonWeb-Applications 注意:我并不是说您指出的链接展示了这一点,而只是一个超越@marcind回答中列出的方法的原因的例子。

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