ASP.NET MVC PartialView通用ModelView

时间:2010-05-26 21:52:19

标签: asp.net-mvc user-controls

我有一个ASP.NET MVC应用程序,我想动态选择局部视图以及传递给它的数据,同时保持强类型。

因此,在主窗体中,我想要一个具有视图模型的类,该视图模型包含一般类型的属性,该属性应该包含局部视图的视图模型的数据。

public class MainViewModel<T>
{
    public T PartialViewsViewModel { get; set; }
}

在用户控件中,我想要像:

Inherits="System.Web.Mvc.ViewUserControl<MainViewModel<ParticularViewModel>>" %>

虽然在我的父母表格中,但我必须加上

Inherits="System.Web.Mvc.ViewPage<MainViewModel<ParticularViewModel>>" %>

让它发挥作用。

有办法解决这个问题吗?用例是使用户控件可插拔。我知道我可以继承一个基类,但这会让我回到像字典而不是类型化的视图模型。

1 个答案:

答案 0 :(得分:1)

您可以使用DisplayTemplates和EditorTemplates来完成此任务。因此,如果我正确地阅读您的问题,您可以使用以下设置:

如果您使用的是.NET 4.0(yay for covariant generics!)

System.Web.Mvc.ViewPage<MainViewModel<object>>

如果您使用的是.NET 3.5:

System.Web.Mvc.ViewPage<MainViewModel<object>>

public class MainViewModel
{
    public object PartialViewsViewModel { get; set; }
}

然后,您可以在该对象上调用DisplayFor以获取局部视图。所以调用:

<%= Html.DisplayFor(m => m.PartialViewsViewModel) %>

将在您的DisplayTemplates文件夹中查找您的类型名称的外观的模板。因此,如果您的DisplayTemplates中有一个ParticularViewModel.ascx,它将使用该控件作为“局部视图”。如果您使用的是其他类型的视图模型类型,则搜索OtherViewModel.ascx(例如)。

ParticularViewModel.ascx的模板将具有:

System.Web.Mvc.ViewUserControl<ParticularViewModel>

这使您可以将对象视为强类型模型。