在Sitecore MVC中在视图渲染和控制器渲染中发布表单

时间:2015-09-14 00:59:35

标签: sitecore sitecore-mvc

我正在阅读以下链接中关于Sitecore MVC中视图呈现的文章:

Sitecore MVC view rendering

但我对在视图渲染中发布表单感到困惑。 是否真的可以在视图渲染中发布表单?

我认为在本文中作者正在讨论从视图呈现部分发布表单中的控制器呈现。不是吗?

还有一个用于控制器渲染的链接:

Sitecore MVC controller rendering

在此链接中发布表单的逻辑与第一个链接类似?

可以请任何人解释一下在视图渲染和控制器渲染中发布表单的区别吗? 当我应该使用视图渲染和控制器渲染?

由于

1 个答案:

答案 0 :(得分:2)

On Martina Welander blog非常好解释了控制器和视图渲染之间的差异。

查看效果图

什么是视图渲染?

视图渲染包含一个默认采用RenderingModel的视图。该模型由Sitecore MVC管道组装,您可以创建自己的自定义模型。因为管道需要在模型上使用Initialize()方法,所以您可以从RenderingModel继承或实现IRenderingModel。

要发布视图渲染,请在组件的定义项目上指定要发布到的控制器和操作。

赞成

它们易于使用 - 特别是如果您不使用自定义模型。大多数情况下,您只想显示上下文或数据源项中的一些内容,而不需要任何业务逻辑 - 一个简单的“页面”通常包含标题和一些文本,您可以使用Sitecore的RenderingModel轻松完成这些操作。 @ Html.Sitecore()帮助器。这里没有太多的单元测试(你当然可以进行web测试),并且创建一个控制器动作似乎是无关紧要的。 从视图呈现发布表单时,它只会发布您指定的操作 - 之后您可以重定向到另一个页面或触发Sitecore呈现管道。控制器渲染不是这种情况,这使得发布表单更加困难。 缺点

如果在检索模型时需要执行任何业务逻辑,则需要在单独的层中执行此操作。但是,由于您无权访问控制器,因此您可以在自定义模型的Initialize()方法中执行此逻辑的唯一位置 - 将业务逻辑放入模型本身并不理想。 它不仅仅是ASP.NET MVC。开发人员习惯于使用控制器和操作,并且视图渲染不能像这样工作。但是,您必须记住,Sitecore MVC是ASP.NET MVC的一个实现,需要支持与Web窗体相同的功能。 Sitecore页面的模块化特性带来了挑战。 用途

就个人而言,如果我正在做的只是从上下文项或数据源项输出一些数据 - 或者即使我输出项目的子项列表,我会使用视图呈现,只要没有业务逻辑(涉及访问权限)。如果我正在做一些需要任何业务逻辑的东西(例如,输出一组搞笑的模糊骰子的降价特价),我会使用控制器渲染。

控制器效果图

什么是控制器渲染?

控制器呈现的组件定义项指定控制器名称和操作名称,而不是指定视图。将渲染添加到占位符时,将执行此操作并返回视图。

赞成

他们看起来是ASP.NET MVC。您可以像往常一样使用依赖项注入和常见模式(如存储库模式),并创建自己的操作。 使您的业务逻辑与您的模型分开;您可以创建由业务逻辑层水合的普通POCO类。 缺点

虽然它们看起来像ASP.NET MVC,但它们仍然是渲染,并且不会像标准ASP.NET MVC应用程序中的控制器操作那样完全表现。当您尝试在页面上放置多个帖子或尝试RedirectToAction时,这一点尤其明显。 它们在主视图已经渲染后执行,这会导致一些意外行为 - 再次,当您尝试发布表单时,这可能会导致一些奇怪的行为,并且使用TempData(如果您使用它)。 在某些情况下,控制器渲染是很多不必要的工作 用途

就个人而言,每当我必须做任何业务逻辑时,我都会使用控制器渲染 - 我注入域/业务逻辑层并使用它来构建特定于该渲染的视图模型,这通常是渲染参数和内容的混合。如果我发布表单,我将尽可能使用AJAX,以避免处理一些表单发布的特性。

我没有遇到过任何证据表明控制器渲染比视图渲染效果差的证据。

总结

由于他们感觉更多的是ASP.NET MVC,所以首先支持控件渲染,因为他们感觉更多的是ASP.NET MVC,我现在只使用视图渲染我的唯一工作就是纯粹输出内容 - 而且由于Sitecore是CMS,所以这种情况发生了很多。如果需要一行业务逻辑代码 - 控制器渲染。我的规则是尽可能地遵循一般的ASP.NET MVC实践:愚蠢的模型,不属于它的业务逻辑,关注点的分离等。如果我可以通过我选择的渲染来遵循这些规则,那么它可能很好。

关于发布控制器呈现的一篇不错的博客文章,您可以找到here