2010-05-26 82 views
2

我有一個ASP.NET MVC應用程序,我想動態地選擇局部視圖和數據傳遞給它,同時保持強類型。ASP.NET MVC PartialView泛型ModelView

因此,在主窗體中,我想要一個具有視圖模型的類,該視圖模型包含一個應該包含局部視圖視圖模型數據的一般類型屬性。

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

在用戶控制,我想是這樣的:

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

雖然在我父窗體,我必須把

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

爲它工作。

有沒有辦法解決這個問題?用例是使用戶控件可插入。我明白我可以繼承一個基類,但這會讓我回到像字典而不是類型化視圖模型。

+0

我決定改變我的做法..利用MasterPage作爲主要部分的視圖,擴展每個特定的視圖。使用母版頁的抽象視圖模型,強制子頁面爲母版頁提供必要的數據。 – 2010-05-28 14:49:29

回答

1

您可以使用DisplayTemplates和EditorTemplates來完成此操作。所以,如果我在讀你的問題的權利,你有這樣的設置:

如果您使用的是.NET 4.0(耶的協變仿製藥!)

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中有一個SpecificViewModel.ascx,它將使用該控件作爲「局部視圖」。如果您使用其他類型的視圖模型類型,則搜索OtherViewModel.ascx(例如)。

爲ParticularViewModel.ascx模板將不得不:

System.Web.Mvc.ViewUserControl<ParticularViewModel> 

,它可以讓你把對象作爲一個強類型的模型。