49 votes

Utilisation d'un modèle générique dans ASP.NET MVC Razor

Est-il possible d'utiliser un modèle générique dans ASP.NET MVC 3 (avec Razor)? Les éléments suivants échouent avec une erreur de syntaxe:

 @model DtoViewModel<T> where T : IDto
 

27voto

Jack Points 845

étant donné que @model attend un type - pas une déclaration de type, vous pouvez utiliser:

 @model DtoViewModel<IDto>
 

et profiter de la covariance générique

22voto

marcind Points 38002

Une telle syntaxe n'est pas supportée par Razor, désolé.

6voto

wodzu Points 150

En supposant que, vous souhaitez utiliser un type générique afin d'éviter les duplications de code dans chaque vue de l' ViewModel<T> vous pouvez le faire de cette façon:

1. créer une vue pour les pièces d' ViewModel<T> qui sont uniques à la vue

ModelView.cshtml:

@model ViewModel<specificType>

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

2. créer une vue pour les parties communes, qui doit être affiché dans chaque vue de l' <T>

De la grille.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>

Puisque c'est une vue partielle, vous n'avez pas besoin de déclarer le type d' Model de nouveau. Il utilisera simplement le modèle que vous avez définis dans la vue parent, qui la rend à la fois. La propriété IList<T> PageItems de votre modèle, restera fortement typé avec <specificType>.

3. N'oubliez pas de fait le rendu de la vue partielle de vos parties communes

ModelView.cshtml:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X