Using a generic model in ASP.NET MVC Razor

Is it possible to use a generic model in ASP.NET MVC 3 (w/ Razor)? The following fails with a syntax error:

@model DtoViewModel<T> where T : IDto

Solution 1:

given that @model is expecting a type - not a type declaration you could use:

@model DtoViewModel<IDto>

and take advantage of generic covariance

Solution 2:

Such syntax is not supported by Razor, sorry.

Solution 3:

Assuming, you want to use a generic type in order to avoid code duplications in each view of ViewModel<T> you can do it this way:

1. create a view for the parts of ViewModel<T> that are unique to the view

ModelView.cshtml:

@model ViewModel<specificType>

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

2. create a view for the common parts, that should be rendered in each view of <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>

Since it's a partial view, you don't need to declare the type of Model again. It will simply use the model you defined in the parent view, that renders it. The property IList<T> PageItems of your model, will remain strongly typed with <specificType>.

3. Don't forget to actually render the partial view of your common parts

ModelView.cshtml:

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

Solution 4:

This is not ideal, but it works and could get pretty creative with this pattern.

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