从单个页面上的多个控制器渲染多个视图

时间:2009-03-08 17:13:48

标签: asp.net-mvc

在我网站的主页上,我想展示几个依赖于自己的控制器进行数据检索的视图。我不想从家庭控制器中的DAL中检索任何内容。

例如,我想显示列出前5个新闻的视图,带有数据库随机引用的视图,带有用户购物车内容的另一个视图等。

在谷歌搜索后,我发现RenderAction方法几乎是完美的,但它在RC1中不可用,仅在期货中,显然,它有一些问题。

我也发现了RenderPartial,但这依赖于主控制器将数据传递给视图。

补充说明:

我不希望家庭控制器中的数据访问逻辑的主要原因是避免重复代码和逻辑。我将在几个页面/控制器中使用前5个新闻视图。我不想在每一个中重复数据检索。我已经将很多逻辑和验证分离到业务层。我之前的解决方案是RenderAction或UserControls,就像在传统ASP中一样。我知道我也可以在MVC中使用它们,但是......最重要的是什么?我的意思是,如果我要求的是太复杂或太荒谬(可重用的UI组件),那么MVC绝对不适合我,我认为它严重低于经典ASP.NET,因为这个要求非常简单。

3 个答案:

答案 0 :(得分:1)

你所要求的是基本上不在HomeController中执行数据访问,这看起来像是教条式的方法。我会考虑使用Futures程序集中的RenderAction(不确定它有什么问题,我在很多项目中使用它)或来自MvcContrib的SubControllers。

答案 1 :(得分:1)

虽然我可以理解不想在多个控制器中复制功能的愿望,但我不理解让你的Home控制器与DAL交互的不情愿。我认为部分视图肯定是要走的路。我不能复制功能的解决方案是将生成各种视图数据的代码推送到业务或数据层。然后,您可以从使用部分视图的每个所需控制器操作中引用它。将它放在业务层可以将控制器与数据层隔离,如果这是你想要的,但我仍然认为控制器动作的正确工作是获取并向视图提供数据。

另一个可能的解决方案是将Home控制器生成的视图通过Ajax回调填充到生成所需视图组件的各种控制器操作。这样做的缺点是,如果浏览器中没有javascript,它不会优雅地失败。

修改

根据您的澄清,我建议实现一个基本控制器,为ActionExecuted中的共享控件填充ViewData(这样只有在操作成功时才​​会执行)。如果要继承此行为,请从基本控制器派生其他控制器。

答案 2 :(得分:0)

如果确实不想使用RenderAction,那么您唯一的另一个选择就是使用操作过滤器加载必要的数据。您的家庭控制器可能如下所示:

public class HomeController : Controller
{
    [RequireNews]
    [RequireQuotes]
    [RequireCart]
    public ActionResult Index()
    {
        return View();
    }
}

可以在需要的地方重复使用这些操作过滤器。您也可以选择将它们放在控制器类本身上。