6

Ho appena avviato un progetto utilizzando ASP.NET MVC 3. Sto costruendo su un sistema di oggetti esistente, quindi una delle prime cose che devo fare è definire la visualizzazione e modelli di editor per i vari tipi esistenti.ASP.NET MVC 3 Generic DisplayTemplates

In MVC è possibile definire un DisplayTemplate con un argomento generico? Ad esempio, abbiamo una classe BitString<T> che accetta un'enumerazione come argomento generico e rappresenta un elenco di opzioni che includono l'enumerazione fornita. Spero di poter definire un singolo modello Display/Editor che gestisca tutte le istanze BitString.

Attualmente sto usando il rasoio per le mie opinioni, ma non mi dispiacerebbe miscelazione e la congruenza con ascx (o etero C# se c'è un modo per farlo) per ottenere questo

Grazie

EDIT: Penso che questo potrebbe essere un dup di questa domanda ... Ma è un anno e mezzo vecchio, quindi forse qualcuno ha una risposta migliore a questo punto? Generic partial view: how to set a generic class as model?

risposta

4

No, non è possibile avere viste con tipo generico se questo tipo generico non è noto. Non è possibile definire un modello come questo:

@model AppName.Models.BitString<T> 

T deve essere conosciuto:

@model AppName.Models.BitString<SomeEnum> 

Detto questo ti consiglierei invece di cercare di riutilizzare alcuni modelli che si aveva in vecchio sistema di pensare di ciò che visualizza i modelli che potresti mettere in atto e quali saranno passati alle viste.

0

questo potrebbe essere tutt'altro che ideale, ma si dovrebbe essere in grado di utilizzare

@model BitString<dynamic> 
+0

Questo non ha funzionato per me ... sei sicuro che sia possibile? –

7

Il problema che stai descrivendo è un principio fondamentale di farmaci generici.

ICollection<Object> non è la classe base di ICollection<String> anche se String è una classe figlio di Object. Questo viene fatto in fase di compilazione, quindi fondamentalmente ottieni due diverse definizioni di classe ICollection. Quindi non possono essere castati. (Le persone intelligenti di SO non esitate a correggermi su eventuali inesattezze)

In MVC3 ho lavorato intorno a questo nel modo seguente:

class Container{ 
    /* Stuff here */ 
} 

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

Quindi secondo lei

@model Container 

Quando hai bisogno solo delle cose comuni senza conoscere il tipo generico.

@model Container<SomeDataType> 

Quando sono necessari i dati di tipo generico.

caso d'uso:

ho creare una classe "ModelContainer" che memorizza il mio modello interno, insieme con una serie di messaggi di errore che possono essere visualizzati nella pagina in un parziale. Poiché il partial può essere utilizzato su ogni pagina, non sa quale sarà il tipo generico, quindi questa soluzione è necessaria.

Questo non può essere utilizzato se si sta tentando di accedere ai dati generici senza conoscerne il tipo. Spero che questo risolva il tuo problema.

5

Sono d'accordo con la risposta di Daryl, ma vorrei solo aggiungere un piccolo miglioramento.

interface IContainer{ 
    dynamic Data {get;} 
} 

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

Quindi secondo lei effettuare le seguenti operazioni:

@model IContainer