I would like to get a list of all views that support rendering a specific model type.
Pseudo code:
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 other words, given that I have a MyClass model, I'd like to find all views that would support rendering it. I.e. all views where the @model type is MyClass, or a type in its inheritance chain.
The Views in ASP.NET MVC application provides the separation of concerns (codes). It means, it separates the user interface from the rest of the application such as the business layer and data access layer. The ASP.NET MVC views use the advanced Razor syntax which makes it easy to switch between the HTML and C# code.
ASP.NET MVC - Views 1 − Open the Visual Studio and click File → New → Project menu option. A new Project dialog opens. 2 − From the left pane, select Templates → Visual C# → Web. 3 − In the middle pane, select ASP.NET Web Application. 4 − Enter the project name ‘MVCViewDemo’ in the Name field and click Ok to continue. ... More items...
Where ASP.NET MVC View Files are Stored? In ASP.NET MVC, the views are having a “.cshtml” extension when we use C# as the programming language with Razor syntax. Usually, each controller will have its own folder in which the controller-specific .cshtml files (views) are going to be saved.
View components provide the same SoC that controllers and views offer. They can eliminate the need for actions and views that deal with data used by common user interface elements. Like many other aspects of ASP.NET Core, views support dependency injection, allowing services to be injected into views.
Based on my findings the compiled views are not included in the assembly, so it's not going to be a walk in the park reflection.
In my opinion your best bet is going to be to list the .cshtml
razor views and then use the BuildManager
class to compile the type, which will allow you to get the Model property type.
Here is an example of looking for all Razor views that have a @Model type of 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
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With