¿Es posible utilizar un modelo genérico en ASP.NET MVC 3 (w/Razor)? A continuación se produce un error de sintaxis:Uso de un modelo genérico en ASP.NET MVC Razor
@model DtoViewModel<T> where T : IDto
¿Es posible utilizar un modelo genérico en ASP.NET MVC 3 (w/Razor)? A continuación se produce un error de sintaxis:Uso de un modelo genérico en ASP.NET MVC Razor
@model DtoViewModel<T> where T : IDto
Tal sintaxis no es compatible con la maquinilla de afeitar, lo siento.
dado que @Model está esperando un tipo - no es una declaración de tipo que puede usar:
@model DtoViewModel<IDto>
y tomar ventaja de covarianza genérica
Suponiendo, desea utilizar un tipo genérico con el fin para evitar duplicaciones de código en cada vista de ViewModel<T>
puede hacerlo de esta manera:
1. crear una vista de las partes de ViewModel<T>
que son únicos a la vista
ModelView.cshtml:
@model ViewModel<specificType>
@{Layout = "~/Views/Shared/Layout.cshtml";}
<h2 class="sub-header">Specific type view</h2>
2. crear una vista para las partes comunes, que debe ser generado en cada vista de <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>
Como es una vista parcial, no necesita declarar el tipo de Model
nuevamente. Simplemente usará el modelo que definió en la vista principal, que lo renderiza. La propiedad IList<T> PageItems
de su modelo, se mantendrá fuertemente tipada con <specificType>
.
. No se olvide de hacer realidad la visión parcial de sus partes comunes
ModelView.cshtml:
@RenderPage("~/Views/Shared/Grid.cshtml")
Esto no es ideal, pero funciona y podría ser bastante creativo con este patrón.
@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;}
}
Bummer. Me encantaría ver su apoyo en el futuro, pero no he visto a nadie más quejarse, así que dudo que gane ningún tipo de tracción. Gracias por tu respuesta. – egoodberry
¡Quiero esto! Entonces eso es queja o al menos una solicitud de otra persona. –
Wow. Eso es bastante impactante para ser honesto. – fearofawhackplanet