ASP.NET MVC:让 ViewModel 进入 ViewPage 的部分视图

Posted

技术标签:

【中文标题】ASP.NET MVC:让 ViewModel 进入 ViewPage 的部分视图【英文标题】:ASP.NET MVC: Getting ViewModel into partial view on ViewPage 【发布时间】:2010-10-01 17:44:55 【问题描述】:

我有一个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,还有第三种选择:我可以在索引控制器中使用 Cache 成员设置 ViewModel 成员,并像这样使用它:

<%= Html.Partial("~/Index/ViewUserControl/Promo.ascx, 
    new PromoViewModel(ViewModel.Cache); %>

哪个更合适?这对我来说似乎有点令人困惑/愚蠢。

【问题讨论】:

【参考方案1】:

就我个人而言,我将它作为与视图关联的模型的一部分。并在控制器中加载该属性......所以我想我会按照上面的#2 说更多。除了我的视图模型将包含“PromoViewModel”实例:

public class MainViewModel 
    public string Prop1get; 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;出于这个原因,我自己更喜欢选项二。 +1 我就是这样做的。我想补充一点,根据场景,您可以在动作过滤器中进行额外提升。 这是我刚刚看到的一个链接,它描述得差不多:lostechies.com/blogs/jimmy_bogard/archive/2009/06/29/…【参考方案2】:

我更喜欢 MVC2 的第二个选项,如果您知道在应用上线时将使用 MVC3(并且确信该功能将保留),则第三个选项。

您列出的选项基本上代表了 MVC 版本中的一系列功能。

【讨论】:

以上是关于ASP.NET MVC:让 ViewModel 进入 ViewPage 的部分视图的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 条件 ViewModel 抽象

Asp.net Core 如何将 ReflectionIT.Mvc.Paging 与 ViewModel 一起使用?

ASP.NET MVC 架构:ViewModel 通过组合、继承还是复制?

将表数据映射到 asp .Net MVC 中的 ViewModel 列表

asp.net core 中的 MVC 架构模式

ASP.NET MVC 敲除绑定不起作用