2

这是一个建筑哲学问题:)

您想要创建非常简单的基于 MVC 的模块化“CMS”的图像。实际上,您唯一希望它做的事情就是您可以使用以下内容(伪语言)指定(例如 XML)每个页面的结构:

使用布局:Subpage.cshtml
对于“标题”部分(布局中的占位符)渲染控制器“标题”,操作“子页面标题”
对于“LeftCol”部分渲染控制器“菜单”操作“MainMenu”
对于“内容”部分渲染控制器“文章”操作“列表”
等等

那么,什么是优雅和推荐的方法呢?我现在可以想到两种方法:

选项1:

定义自己的路由,它将捕获所需的 URL 并为此请求创建自己的 MyMvcHandler。在此处理程序中,处理不会实例化控制器(没有一个“主”),而是会读取“页面结构配置”(上面的示例),实例化所有必需的控制器..但我不确定,该做什么这一点 - 如何收集动作的结果并将它们放入布局中?

选项 2:让默认的 MvcHandler 存活,并始终使用一些默认操作调用一些“MasterController”,这只会返回 View(layoutPage); 在布局页面中,实现“页面部分”(内容的占位符)作为我自己的辅助方法,类似于 Html.RenderAction - 仅定制为查看“页面结构配置”并呈现正确的控制器+动作。但是这样一来,MasterController 在管道中对我来说似乎真的没用,有什么办法可以摆脱他吗?

你能想出更好的办法吗?你能看到这些方法的一些基本起伏吗?你能给我指出一些关于这个主题的好资源吗?(我找不到任何)。

非常感谢 MVC 忍者 ;)

4

3 回答 3

0

这当然是可能的,因为你提到的方法(这比部分方法更灵活):

Html.RenderAction("AnyAction", "AnyController")

我认为这个概念的最大问题是状态。如果您走这条路,并且“AnyController”需要维护状态,则需要将其形式化。否则:谁将拥有查询字符串和 post 变量的权威?如果变量名发生冲突,你会怎么做?

请注意,ASP.NET 经典已经通过其回发状态字段以某种方式“解决”了这个问题。它为所有页面元素分配唯一 ID,并将其放入树中。最大的缺点是它很快就会变得臃肿和低效,就像 ASP.NET 经典的情况一样。

您还可以查看其他 CMS 是如何解决此问题的,例如 N2CMS(免责声明:我对任何其他 CMS 几乎没有经验)。我认为它的实现在某种程度上类似于您的第二个选择。您在 CMS 中指定哪些块进入哪个区域,然后系统调用所有视图。不同之处在于,对于子视图,视图的内容模型是由系统而不是特定控制器计算出来的,尽管您可以通过调用 RenderAction 而不是 RenderView 从概念上改变它(不确定在实践中有多可行)。但在那种情况下,你又要参加州讨论了。

于 2012-08-30T05:57:43.153 回答
0

由于您想要不同的控制器并且焦点类似于 CMS,因此我建议以下内容:

  1. 有 1 个控制器来处理用户看到的主要 URL 和布局(如您的选项 2)

  2. 对于每个部分,让 Ajax 回调以获取每个部分的 HTML(标题/菜单/文章/等)

是的,这打了 4 次电话,...但权衡是巨大的。

例如一些好处:

  1. 每个部分现在可以有独立的缓存头。(例如,布局可以缓存几天/几周,而不是修改)

  2. 每个部分都可以独立刷新,而无需客户端导航或刷新页面。

  3. 由于每个部分都是独立处理的,因此如果需要,可以使用 SignalR 处理实时更新。

  4. 这些部分(假设它们也可能进一步划分)可以跨页面共享。(例如,文章可以在适用的情况下在多个屏幕上重复使用,......并且也属于与好处#1相同的缓存好处)

  5. 如果需要,可以在刷新每个内容片段时通过参数对每个部分进行更改。

  6. 如果需要,可以轻松操作每个部分/控制器/动作以传回 Json 而不是 HTML,以便客户端可以增强功能体验。(这是假设您没有使用诸如淘汰赛之类的框架进行客户端 MVC)

希望这可以帮助。

于 2012-08-23T15:48:39.447 回答
0

母版页是实现目标的更简单方法。母版页可用于在应用程序的多个页面之间共享公共内容。这是 ASP.net MVC 网页的链接,用于使用查看母版页创建页面布局

希望这可以帮助。

于 2012-08-27T17:21:01.103 回答