【发布时间】:2011-08-09 19:18:33
【问题描述】:
是否可以在 ASP.NET MVC 3 (w/ Razor) 中使用通用模型?以下失败并出现语法错误:
@model DtoViewModel<T> where T : IDto
【问题讨论】:
标签: generics asp.net-mvc-3 razor
是否可以在 ASP.NET MVC 3 (w/ Razor) 中使用通用模型?以下失败并出现语法错误:
@model DtoViewModel<T> where T : IDto
【问题讨论】:
标签: generics asp.net-mvc-3 razor
鉴于@model 期待一个类型 - 而不是类型声明 你可以使用:
@model DtoViewModel<IDto>
并利用泛型协方差
【讨论】:
Razor 不支持这种语法,抱歉。
【讨论】:
假设您想使用泛型类型以避免ViewModel<T> 的每个视图中的代码重复,您可以这样做:
1.为视图特有的ViewModel<T>部分创建视图
ModelView.cshtml:
@model ViewModel<specificType>
@{Layout = "~/Views/Shared/Layout.cshtml";}
<h2 class="sub-header">Specific type view</h2>
2.为公共部分创建一个视图,该视图应在<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的类型。它只会使用您在父视图中定义的模型来呈现它。您的模型的属性IList<T> PageItems 将保持为<specificType> 的强类型。
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;}
}
【讨论】:
我找到了这个线程并做了一些进一步的挖掘。 该功能似乎在 2.2.0 待办列表中。如果有人想参与,您可以在 Github 上查看问题。 https://github.com/aspnet/Mvc/issues/7152
【讨论】: