Razor视图引擎RenderSection

Razor视图引擎RenderSection

问题描述:

我真的挖这个新的Razor视图引擎......对于有人从其他网络平台的新的MVC 3的努力开始有宾至如归的感觉,我只是来...Razor视图引擎RenderSection

我的问题是关于部分,我发现可以在您的布局中定义部分并向其中注入内容,但从我看到的所有示例看来,这是从视图中完成的。对我来说,为控制器的每个部分分配内容或输出更有意义。

所以,如果我有一个布局,其中包含一个侧栏,我想加载我的视图文件不应该负责将内容渲染到这些部分。如果是这种情况,那么如果侧栏内容在多个视图*享,那么我将不得不在整个视图文件中复制该代码。我的视图文件应该不知道在旁边的边栏中显示的内容是什么。

理想情况下,我想从我的控制器的侧栏中分配内容给我的部分,所以我的问题,这可能吗?

+2

为什么从控制器做到这一点会更有意义?控制器通常不应该有任何视图逻辑;他们只负责挑选视图并将模型交给它。 – Aaronaught 2010-11-19 03:20:28

+0

为什么你不创建一个局部视图,并根据需要在视图中使用它? – timothyclifford 2010-11-19 03:26:59

+0

如果您仔细考虑,控制器确实具有视图逻辑,他们会初始化视图模型,在某些情况下为其分配值,然后调用使用它的相应视图。部分也应该做同样的事情。 – JBeckton 2010-11-19 03:52:27

在ASP.NET MVC(以及其他基于MVC的Web应用程序体系结构)中,控制器准备由视图呈现的数据。如何以及何时甚至何时呈现这些数据是视图的工作。这当然更多的是建筑设计讨论。

关于ASP.NET MVC的一个好处是他们的'约定优于配置'的观点(尤其是使用Razor)可以让你改变很多事情的行为。我不认为有View.Sections["section1"] = <some data>;选项,但是您可以制作基于部分的ViewModel,然后使用一些通用主视图,将ViewModel分开,并发送正确的数据以纠正部分视图。该部分的视图模型甚至可以容纳必须呈现的HTML,因为Razor可用于在.cshtml文件之外呈现HTML。如需了解更多信息,请访问Andrew Nures的博客:http://blog.andrewnurse.net/

正如您所见,这会将很多责任从视图转移到控制器。我自己喜欢渲染完全与控制器分离,然后我可以通过改变数据的渲染方式假设构建不同的网站。

+0

我使用视图模型,我想我不理解如何在使用视图模型时跨多个动作使用视图。根据你们的说法,我要么将相同的代码复制到多个视图页面,要么在多个操作中使用相同的视图页面。或者可能为每个视图复制视图模型中的代码。我不会购买这样一个想法,即我应该把代码放在我的观点“可能的业务逻辑”中,以决定什么时候在某个特定视图的何时何地呈现。 – JBeckton 2010-11-19 04:12:35

+0

如果我想分配模块或小部件来输出某个页面上的特定部分,其中确定哪些部分在数据表中呈现的内容,我不会在我认为的代码中处理这些决定。 – JBeckton 2010-11-19 04:13:14

+1

有几种方法可以将视图的责任与内容分开。 Html.Action(...)可用于获取当前视图中呈现的另一个动作的代码。您可能仍然必须在视图中执行一些最小化逻辑,以告知有关您的应用状态的操作。但是,你当然可以预先计算这个值,然后把它归结为标志。但正如我所说的尝试看看安德鲁护士的博客文章有关在ASP.NET之外使用Razor,它可能会给你一些想法。 – gligoran 2010-11-19 05:36:40