-1

我们通常在框架文档中看到的是简单的类似博客的应用程序,其中每个页面仅与一个模型和一个控制器相关。

如何处理最常见的情况,即单个页面必须显示来自不同模型的信息?

例子:

显示以下内容的社交网络主页:

  • 最近的用户帖子
  • 最近的用户
  • 来自管理员的消息
  • 玩过最多的游戏

这是否应该由单个控制器处理,该控制器从不同模型加载所有这些信息并将其发送到可能分解为部分/元素的视图?

有人在另一个问题中说,我可以为这样的页面创建类似 HomePageController 的东西。如果所有这些信息都应该显示在站点上所有页面的侧边栏中,我该如何处理?

4

3 回答 3

1

通常,您将收集所有不同类型的数据并将其一起传递给视图:

MVC 框架通常提供一些方法来将请求 URL(例如/offers?id=5)映射到控制器(或它们的方法)。

假设您想在主页上显示一些数据。
为此,您将首先定义从 URL/home到某个特定控制器的映射,比如说HomePageController. 使用您的示例数据,您将在控制器中拥有类似的内容(在将处理请求的方法中):

model.add(dao.getRecentUserPosts());
model.add(dao.getRecentUsers());
model.add(dao.getNewsFromAdmins());
model.add(dao.getMostPlayedGames());

render("viewName", model);

根据对映射到此特定控制器的某些地址的请求,您将从数据访问对象 ( dao) 中获取不同类型的数据,并将它们添加到您的model.
一旦model填充了数据,您可以将其传递给视图(= renderview with this model),并且在视图中您可以以任何您想要的方式显示它。

我希望您现在已经清楚了基本流程。

参考@BeK 的回答
处理需要更长时间的请求总是需要单独的方法。您可以选择异步加载此部分,您可以(并且可能会)尝试尽可能多地缓存。

加载侧边栏:
大多数 MVC 框架为您的视图提供某种“基本模板”。
这意味着您可以定义显示在每个页面上的视图的一部分(例如侧边栏或页脚),特别是您只关心动态部分的控制器。这些解决方案足够灵活,可以满足大多数典型需求。
根据您在该侧边栏中显示的内容,有很多选项 -它是静态的还是动态的?可以缓存什么?等等

于 2013-11-14T14:52:53.527 回答
0

这里有几个选项。这实际上取决于您正在加载什么样的数据。如果其中一个数据请求需要很长时间,则在收集所有数据之前不会显示视图。如果您将视图分解为部分视图并让它们异步加载,用户将拥有更好的用户体验。通过这种方式,您可以拥有单独的控制器/控制器方法,符合SRP等模式。

如果您希望所有数据都显示在每个页面的侧边栏中,那么处理它的控制器可能是一个更简单的解决方案,但我再次建议您查看您正在加载的数据,尤其是它所花费的时间加载所有数据。希望这能回答您的问题或让您走上正确的道路。

于 2013-11-14T14:40:22.190 回答
0

遵循 SRP 的替代方法是使用 MVC 子操作。

创建许多模型和控制器。每个控制器负责自己的业务逻辑,例如。

  • 帖子控制器
  • 新闻控制器
  • 游戏控制器
  • 家庭控制器

从呈现 HomePage.cshtml 的 HomeController 开始

<div>@Html.Partial("Login.cshtml", Model.CurrentUser)</div>
<div>
    <hgroup>
        <h2>what's new</h2>
    </hgroup>
    <div>@Html.Action("WhatNew", "News")</div>
    <div>@Html.Action("RecentlyPosted", "Posts")</div>
</div>
<aside>
    <h2>Games</h2>
    <div>@Html.Action("MostPlayed", "Games")</div>
</aside>

您可以在 HomeController 中获取许多控制器/动作名称的列表作为字符串,然后在主页中呈现多个子动作。

于 2013-11-15T04:21:35.847 回答