【发布时间】:2009-03-13 05:46:34
【问题描述】:
ASP.NET MVC 中的“RenderPartial()”方法提供了非常低级别的功能。它不提供,也不试图提供真正的“子控制器”模型*。
我有越来越多的控件通过“RenderPartial()”呈现。它们分为三大类:
1) 直接控制 特定页面的后代 使用该页面的模型
2) 直接控制 特定页面的后代 将该页面的模型与 additional key of some type。 考虑实施 '数据中继器'。
3) 表示不相关的控件 它们出现的页面的功能 在。这可能是任何事情 横幅旋转器,反馈表, 商店定位器,邮件列表注册。 关键是它不在乎 它放在哪个页面上。
由于ViewData 模型的工作方式,每个请求只存在一个模型对象 - 也就是说,子控件需要的任何东西都必须存在于页面模型中。
最终,MVC 团队有望推出真正的“子控制器”模型,但在此之前,我只是在主页面模型中添加子控件也需要的任何内容。
在上述 (3) 的情况下,这意味着我的“ProductModel”模型可能必须包含“MailingListSignup”模型的字段。显然这并不理想,但我已经接受了与当前框架的最佳折衷方案 - 并且最不可能“关闭任何门”到未来的子控制器模型。
控制器应该负责获取模型的数据,因为模型实际上应该只是一个不知道从哪里获取数据的愚蠢数据结构。但我不希望控制器必须在几个不同的地方创建模型。
我已经开始做的是创建一个工厂来为我创建模型。这个工厂被控制器调用(模型不知道工厂)。
public static class JoinMailingListModelFactory {
public static JoinMailingListModel CreateJoinMailingListModel() {
return new JoinMailingListModel()
{
MailingLists = MailingListCache.GetPartnerMailingLists();
};
}
}
所以我的实际问题是其他有同样问题的人实际上是如何创建模型的。未来与新 MVC 功能兼容的最佳方法是什么?
- 注意:
RenderAction()存在一些问题,我不会在这里讨论——尤其是它只存在于 MVCContrib 中,不会出现在 ASP.NET-MVC 的 RTM 版本中。其他问题导致sufficent problems 我选择不使用它。所以让我们暂时假设只有RenderPartial()存在 - 或者至少那是我决定使用的。
【问题讨论】:
标签: asp.net-mvc renderpartial subcontroller