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

ego*_*rry 49 generics razor asp.net-mvc-3

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

@model DtoViewModel<T> where T : IDto
Run Code Online (Sandbox Code Playgroud)

Jac*_*ack 27

鉴于@model期望一个类型 - 而不是类型声明,你可以使用:

@model DtoViewModel<IDto>
Run Code Online (Sandbox Code Playgroud)

并利用通用协方差


mar*_*ind 22

Razor不支持这种语法,抱歉.

  • 游民.我希望将来能够看到对它的支持,但是我还没有看到其他任何人对它的关注,所以我怀疑它会获得任何牵引力.感谢您的回答. (7认同)
  • 我要这个!所以这是抱怨或至少是另一个人的要求. (4认同)

wod*_*dzu 6

假设,您希望使用泛型类型以避免在每个视图中的代码重复,ViewModel<T>您可以这样做:

1.为视图ViewModel<T>特有的部分创建视图

ModelView.cshtml:

@model ViewModel<specificType>

@{Layout = "~/Views/Shared/Layout.cshtml";}
<h2 class="sub-header">Specific type view</h2>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

由于它是局部视图,因此您无需Model再次声明类型.它将简单地使用您在父视图中定义的模型来呈现它.IList<T> PageItems您的模型的属性将保持强类型<specificType>.

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

ModelView.cshtml:

@RenderPage("~/Views/Shared/Grid.cshtml")
Run Code Online (Sandbox Code Playgroud)