2011-02-26 15 views
16

È possibile creare classi all'interno di un modello? Qualcosa come ...Classi nel modello di motore per rasoio

@{ 
    public class MyClass { 
     public MyClass() { 
      Three = new List<string>(); 
     } 

     public string One { get; set; } 
     public int Two { get; set; } 
     public List<string> Three { get; set; } 
    } 
} 

Attualmente visualizzo "Impossibile compilare il modello. Controlla l'elenco Errori per i dettagli." quando provo a farlo. Vorrei prendere il contenuto XML e utilizzare XmlSerializer per creare un'istanza di MyClass all'interno del modello. Non posso fare la deserializzazione in anticipo e inserirla nel modello perché le classi potrebbero variare a seconda del modello.

+1

Se si potesse non sarebbe questo completamente bypassare l'intera idea di avere modelli/vista/controller, in primo luogo? – rene

+0

Non puoi portare 'MyClass' in un file separato? OK, quindi renderà 2 file per modello, ma funzionerà. –

+1

Puoi deselezionare la "risposta" e controllare la risposta "Kirk Woll" invece di quella è la risposta corretta. –

risposta

5

vi posterò la mia risposta dal CodePlex Discussion qui:

io non sono sicuro che è attualmente possibile. Quando si utilizzano i blocchi di codice (@ {}), si sta effettivamente scrivendo il codice all'interno di un metodo, ad es. il tuo codice sopra farebbe qualcosa di simile:

public void Execute() 
{ 
    this.Clear(); 
    public class MyClass { 
     public MyClass() { 
      Three = new List<string>(); 
     } 

     public string One { get; set; } 
     public int Two { get; set; } 
     public List<string> Three { get; set;} 
    } 
} 

... che, naturalmente, non è valido C#. L'altro problema che dovrai affrontare è quello di utilizzare la serializzazione/deserializzazione xml, il tipo deve essere noto, ma se stai definendo il tuo tipo all'interno del modello stesso, come potresti deserializzare in primo luogo?

Che cosa si potrebbe fare, è usare un modello di base personalizzato:

public class CustomTemplateBase<T> : TemplateBase<T> 
{ 
    public dynamic Instance { get; set; } 

    public dynamic CreateInstance(string typeName) 
    { 
     Type type = Type.GetType(typeName); 

     // You'd to your deserialisation here, I'm going to 
     // just cheat and return a new instance. 
     return Activator.CreateInstance(type); 
    } 
} 

Utilizzando una proprietà dinamica e tipo di ritorno dinamica, abbiamo definito un metodo che ci permetterà di creare un'istanza (attraverso l'attivazione o deserializzazione, ecc.) e chiamare l'accesso ai membri su di esso. Per utilizzare che in un modello, si potrebbe poi fare:

@{ 
    Instance = CreateInstance("ConsoleApplication1.MyClass, ConsoleApplication1"); 
    Instance.One = "Hello World"; 
} 
<h1>@Instance.One</h1> 

Dove "MyClass" è un definito da qualche parte nella mia applicazione. L'importante è che sto creando un'istanza per modello.

3

Suggerirei di utilizzare una classe ViewModel specifica, che potrebbe avere una proprietà dinamica (ExpandoObject) che consente di popolarla con qualsiasi struttura dati personalizzata, se necessario, pur continuando a comunicare fortemente digitata per qualsiasi altra cosa la visualizzazione potrebbe richiedere.

Ciò mantiene anche i vostri modelli di vista separati dalle viste stesse, il che è una buona pratica (il codice HTML e il codice HTML non si mescolano troppo bene laddove la leggibilità è un problema).

64

Sì, questo è completamente possibile. Usa la parola chiave @functions:

@functions { 
    public class MyClass { 
     public MyClass() { 
      Three = new List<string>(); 
     } 

     public string One { get; set; } 
     public int Two { get; set; } 
     public List<string> Three { get; set; } 
    } 
} 
+4

Se è una buona idea o no, è pronto per il dibattito, ma questo risponde alla domanda, quindi uptote da me. (Rispo dato che posso modificare solo le viste nella mia soluzione, questo è ciò di cui ho bisogno, nonostante l'odore del codice) – DarcyThomas

+3

Questo è perfetto per la situazione in cui si desidera creare tipi di trasformazione intermediari ma non si desidera utilizzare tipi anonimi come non può passare a quelli che aiutano il rasoio. Tristemente, piattaforme come Umbraco non funzionano molto bene con approcci molto pesanti. Non lo farei molto spesso se i tuoi controller sono perfettamente in grado di eseguire tutte le trasformazioni richieste in un ViewModel più concreto. –

+1

upvote.su un progetto più ampio non lo fai di solito, ma su normali web matrix di piccole dimensioni, sarebbe più intelligente e più facile. perché tutti i bug compiaciuti? –

Problemi correlati