6

Acabo de comenzar un proyecto con ASP.NET MVC 3. Estoy construyendo sobre un sistema de objetos existente, por lo que una de las primeras cosas que tengo que hacer es definir la visualización y plantillas de editor para los diversos tipos que existen.ASP.NET MVC 3 Generico DisplayTemplates

¿Es posible en MVC definir un DisplayTemplate con un argumento genérico? Por ejemplo, tenemos una clase BitString<T> que toma una enumeración como el argumento genérico y representa una lista de opciones que envuelve la enumeración suministrada. Espero poder definir una única plantilla de Pantalla/Editor que maneje todas las instancias de BitString.

Actualmente estoy usando la maquinilla de afeitar de mis puntos de vista, pero no me importa mezclar y combinar con ascx (o recta C# si hay una manera de hacerlo) para lograr este

Gracias

EDITAR: Creo que esto podría ser un doble de esta pregunta ... Pero es un año y medio de edad, así que tal vez alguien tiene una mejor respuesta en este momento? Generic partial view: how to set a generic class as model?

Respuesta

4

No, no es posible tener vistas con tipo genérico si se desconoce este tipo genérico. No se puede definir un modelo como este:

@model AppName.Models.BitString<T> 

T tiene que ser conocido:

@model AppName.Models.BitString<SomeEnum> 

Dicho esto os recomendaría en lugar de tratar de reutilizar algunos modelos que tenía en su antiguo sistema de pensar de lo que vea los modelos que pueda colocar en su lugar y que se pasarán a las vistas.

0

Esto podría ser menos que ideal, pero debe ser capaz de utilizar

@model BitString<dynamic> 
+0

Esto no funcionó para mí ... ¿está seguro de que es posible? –

7

El problema que describes es un principio fundamental de los genéricos.

ICollection<Object> no es la clase base de ICollection<String> aunque String es una clase secundaria de Object. Esto se hace en tiempo de compilación, por lo que básicamente obtienes dos definiciones de clase ICollection diferentes. Por lo tanto, no pueden ser convertidos. (Las personas inteligentes de tan sienten libres de corregirme en cualquier inexactitud)

En MVC3 que han trabajado en torno a esta de la siguiente manera:

class Container{ 
    /* Stuff here */ 
} 

class Container<T> : Container{ 
T Data {get;set;} 
} 

A continuación, en su opinión

@model Container 

Cuando solo necesita las cosas comunes sin saber el tipo genérico.

@model Container<SomeDataType> 

Cuando necesite los datos de tipo genérico.

Caso de uso:

puedo crear una clase "ModelContainer" que almacena mi modelo en el interior, junto con una serie de mensajes de error que se pueden visualizar la página en un parcial. Como el parcial se puede usar en cada página, no sabe cuál será el tipo genérico, por lo que se necesita esta solución.

Esto no se puede utilizar si está intentando acceder a los datos genéricos sin conocer su tipo. Espero que esto resuelva tu problema.

5

Estoy de acuerdo con la respuesta de Daryl, pero solo añadiría una pequeña mejora.

interface IContainer{ 
    dynamic Data {get;} 
} 

class Container<T> : IContainer{ 
    T Data {get;set;} 
    dynamic IContainer.Data 
    { 
    get { return this.Data; } 
    } 
} 

A continuación, en su opinión, hacer lo siguiente:

@model IContainer