ASP.NET MVC 中的“RenderPartial()”方法提供了非常低级别的功能。它不提供,也不试图提供真正的“子控制器”模型*。
我有越来越多的控件通过“RenderPartial()”呈现。它们分为 3 个主要类别:
1) 作为使用该页面模型的特定页面的直接后代的控件
2) 作为特定页面的直接后代的控件,这些控件使用该页面的模型和 某种类型的附加键。想想“DataRepeater”的实现。
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 版本中。其他问题引起了足够多的问题,我选择不使用它。所以让我们暂时假装它只RenderPartial()
存在——或者至少那是我决定使用的。