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