ASP.NET MVC:将ViewModel放到ViewPage的局部视图中

时间:2010-10-01 17:44:56

标签: asp.net-mvc model view

我有一个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); %>

哪个更合适?这对我来说似乎有些混乱/愚蠢。

2 个答案:

答案 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版本中功能的进展,基本上。