我有一个ViewPage
,Index.aspx。在其中,我有:
<%= Html.Partial("~/Index/ViewUserControl/Promo.ascx, new PromoViewModel()); %>
现在,PromoViewModel
的构造函数需要索引控制器也使用的MemcachedCache
对象。
我应该如何将此MemcachedCache
传递给我的部分视图?
我应该将MemcachedCache
实例放在ViewData
并执行此操作吗?
<%= Html.Partial("~/Index/ViewUserControl/Promo.ascx,
new PromoViewModel(ViewData["cache"] as MemcachedCache)); %>
Index.aspx不是强类型视图;它不使用视图模型。但是,我应该使用具有公开Cache
成员的视图模型强力输入,然后通过Model
访问它吗?
<%= Html.Partial("~/Index/ViewUserControl/Promo.ascx,
new PromoViewModel(Model.Cache); %>
现在我发现MVC3,还有第三种选择:我可以在索引控制器中使用ViewModel
成员设置Cache
成员,并像这样使用它:
<%= Html.Partial("~/Index/ViewUserControl/Promo.ascx,
new PromoViewModel(ViewModel.Cache); %>
哪个更合适?这对我来说似乎有些混乱/愚蠢。
答案 0 :(得分:2)
就个人而言,我将它作为我的模型的一部分与视图相关联。并在控制器中加载该属性......所以我想我在上面的第2行中说的更多。除了我的View模型将包含“PromoViewModel”实例:
public class MainViewModel {
public string Prop1{get; set;}
public PromoViewModel Promo {get; set; }
}
public class MainController {
public ActionResult Hello() {
// Retrieve "cache" or whatever
var promoModel = new PromoViewModel(cache);
return new MainViewModel {Prop1 = "Hello", Promo = promoModel };
}
}
我的理由是,我的视图模型就是它,我需要在页面上显示的所有内容。我的控制器负责组装它,执行大部分工作的各种服务等......
答案 1 :(得分:0)
我更喜欢你的MVC2的第二个选项,如果你知道你将在应用程序上线时使用MVC3(并且确信该功能仍然存在),那么第三个选项。
您列出的选项代表了MVC版本中功能的进展,基本上。