在ASP.NET MVC Razor中使用通用模型

是否有可能在ASP.NET MVC 3(w / Razor)中使用通用模型? 以下语法错误会失败:

@model DtoViewModel<T> where T : IDto 

这种语法不被Razor支持,对不起。

因为@model正在期待一个types – 而不是一个types声明,你可以使用:

 @model DtoViewModel<IDto> 

并利用通用协方差

假设您想使用genericstypes来避免ViewModel<T>每个视图中的代码重复,您可以这样做:

1.为视图独有的ViewModel<T>部分创build一个视图

ModelView.cshtml

 @model ViewModel<specificType> @{Layout = "~/Views/Shared/Layout.cshtml";} <h2 class="sub-header">Specific type view</h2> 

2.为公共部分创build一个视图,这些视图应在每个<T>视图中呈现

Grid.cshtml

 @{ var webGrid = new WebGrid(Model.PageItems); } <div class="row" style="overflow: auto"> @webGrid.GetHtml("table-striped", mode: WebGridPagerModes.All, firstText: "First", lastText: "Last") </div> 

由于是局部视图,因此不需要再次声明Model的types。 它将简单地使用您在父视图中定义的模型来渲染它。 您的模型的属性IList<T> PageItems将保持与<specificType>强types。

3 。 不要忘记实际渲染公共部分的局部视图

ModelView.cshtml

 @RenderPage("~/Views/Shared/Grid.cshtml") 

这是不理想的,但它的工作原理,可以用这种模式非常有创意。

 @model YourNameSpace.MyModel public MyModel { public MyGenericType<string> ModelAStuff {get;set;} public MyGenericType<int> ModelBStuff {get;set;} public MyGenericType<DateTime> ModelCStuff {get;set;} } public class MyGenericType<T> { //use T how ever you like public T Color {get;set;} public T Year {get;set;} }