2014-10-31 2 views
6

Я хотел бы получить список всех представлений, поддерживающих рендеринг определенного типа модели.Инициализировать представления ASP.NET MVC, чтобы найти все представления, поддерживающие определенный тип модели.

псевдокод:

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 
     } 
    } 
} 

Других слова, учитывая, что у меня есть модель MyClass, я хотел бы найти все виды, которые будут поддерживать его рендеринг. То есть все виды, где тип @model - MyClass, или тип в цепочке наследования.

+0

Кстати - какова цель? – Landeeyo

+0

Часть прототипа для создания системы шаблонов «Wordpress-esque» для CMS на основе MVC, где новые шаблоны можно просто удалить внутри проекта и разрешить во время выполнения. –

ответ

6

Основываясь на моих выводах, собранные виды не включены в сборку, поэтому это не будет прогулкой в ​​отражении парка.

На мой взгляд, ваш лучший выбор - перечислить виды бритвы .cshtml, а затем использовать класс BuildManager, чтобы скомпилировать тип, который позволит вам получить тип собственности Модели.

Вот пример того, чтобы искать для всех представлений Razor, которые имеют тип @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

Да, я закончил делать что-то подобное. Спасибо за помощь! –

+0

добро пожаловать;) –

Смежные вопросы