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.
fonte
2011-02-27 10:22:51
Se si potesse non sarebbe questo completamente bypassare l'intera idea di avere modelli/vista/controller, in primo luogo? – rene
Non puoi portare 'MyClass' in un file separato? OK, quindi renderà 2 file per modello, ma funzionerà. –
Puoi deselezionare la "risposta" e controllare la risposta "Kirk Woll" invece di quella è la risposta corretta. –