我有一个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>>" %>
让它发挥作用。
有办法解决这个问题吗?用例是使用户控件可插拔。我知道我可以继承一个基类,但这会让我回到像字典而不是类型化的视图模型。
答案 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>
这使您可以将对象视为强类型模型。