2014-10-31 5 views
6

Vorrei ottenere un elenco di tutte le viste che supportano il rendering di un tipo di modello specifico.Iterare le visualizzazioni MVC ASP.NET per trovare tutte le viste che supportano un tipo di modello specifico

pseudo codice:

IEnumerable GetViewsByModelType(Type modelType) 
{ 
    foreach (var view in SomeWayToGetAllViews()) 
    { 
     if (typeof(view.ModelType).IsAssignableFrom(modelType)) 
     { 
     yield return view; // This view supports the specified model type 
     } 
    } 
} 

In altre parole, dato che ho un modello di MyClass, mi piacerebbe trovare tutte le viste che sosterrebbero rendendolo. Cioè tutte le viste in cui il tipo @model è MyClass o un tipo nella sua catena di ereditarietà.

+0

Tra l'altro - qual è lo scopo? – Landeeyo

+0

Parte di un prototipo per la creazione di un sistema di template "Wordpress-esque" per un CMS basato su MVC in cui i nuovi modelli possono essere semplicemente rilasciati all'interno del progetto e risolti in fase di runtime. –

risposta

6

Sulla base delle mie conclusioni, le viste compilate non sono incluse nell'assemblaggio, quindi non sarà una passeggiata nel riflesso del parco.

A mio parere la soluzione migliore sta per essere quello di elencare i .cshtml vista rasoio e quindi utilizzare la classe BuildManager per compilare il tipo, che vi permetterà di ottenere il tipo di proprietà del modello.

Ecco un esempio di ricerca di tutte le viste Razor che hanno un tipo di @Model LoginViewModel:

var dir = Directory.GetFiles(string.Format("{0}/Views", HostingEnvironment.ApplicationPhysicalPath), 
    "*.cshtml", SearchOption.AllDirectories); 

foreach (var file in dir) 
{ 
    var relativePath = file.Replace(HostingEnvironment.ApplicationPhysicalPath, String.Empty); 

    Type type = BuildManager.GetCompiledType(relativePath); 

    var modelProperty = type.GetProperties().FirstOrDefault(p => p.Name == "Model"); 

    if (modelProperty != null && modelProperty.PropertyType == typeof(LoginViewModel)) 
    { 
     // You got the correct type 
    } 
} 
+0

Sì, ho finito per fare qualcosa del genere. Grazie dell'aiuto! –

+0

siete i benvenuti;) –

Problemi correlati