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 Core 如何将 ReflectionIT.Mvc.Paging 与 ViewModel 一起使用?
ASP.NET MVC 架构:ViewModel 通过组合、继承还是复制?