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
Une telle syntaxe n'est pas prise en charge par Razor, désolé.
é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
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")
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
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;}
}