web-dev-qa-db-fra.com

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)? Ce qui suit échoue avec une erreur de syntaxe:

@model DtoViewModel<T> where T : IDto
49
egoodberry

Une telle syntaxe n'est pas prise en charge par Razor, désolé.

22
marcind

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

@model DtoViewModel<IDto>

et tirez parti de la covariance générique

27
Jack

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

1. créer une vue pour les parties de 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 rendue dans chaque vue de <T>

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>

Puisqu'il s'agit d'une vue partielle, vous n'avez pas besoin de déclarer à nouveau le type de Model. Il utilisera simplement le modèle que vous avez défini dans la vue parent, qui le rendra. La propriété IList<T> PageItems de votre modèle, restera fortement typé avec <specificType>.

. N'oubliez pas de rendre réellement la vue partielle de vos parties communes

ModelView.cshtml :

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

J'ai trouvé ce fil et j'ai creusé davantage. On dirait que la fonction est sur le backlog 2.2.0 . Si quelqu'un veut s'impliquer, vous pouvez consulter le problème sur Github. https://github.com/aspnet/Mvc/issues/7152

1
Licht

Ce n'est pas idéal, mais cela fonctionne et pourrait être assez créatif avec ce modèle.

@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;}
}
0
chdev77