Skip to content
Enable feature folders for MVC controllers and views in ASP.NET Core
Branch: master
Clone or download
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
sample/WebApplication adding viewimports and tag helpers to sample app Nov 23, 2018
src/OdeToCode.AddFeatureFolders
test/OdeToCode.AddFeatureFolders.Tests Add netstandard2.0 target to src and netcoreapp2.0 target to test Feb 28, 2018
.gitignore
AddFeatureFolders.sln rebuilt solution file after migration May 27, 2017
LICENSE
README.md
appveyor.yml update subject for appveryor build Jun 29, 2017
build.ps1 update for net20 build Nov 6, 2017

README.md

AddFeatureFolders

Build status

Installation

    Install-Package OdeToCode.AddFeatureFolders 

Usage

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc()
                    .AddFeatureFolders();

            // "Features" is the default feature folder root. To override, pass along 
            // a new FeatureFolderOptions object with a different FeatureFolderName
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            app.UseDeveloperExceptionPage();
            app.UseMvcWithDefaultRoute();
        }
    }    

Now you can organize controllers and views in a Features folder hierarchy

See the sample folder for more examples.

\Features \Home \HomeController.cs \HomeViewModel.cs \HomeIndexHandler.cs \HomeIndexQuery.cs \Index.cshtml

Important!

AddFeatureFolders uses the namespace of the controller to figure out where the views are. For example:

/Features
	/Robots
		/Robots.cshtml

The above example folder structure relies on the namespace of the controller being <whatever>.Features.Robots.

If you encounter problems with MVC locating the views, check your controller namespace.

Disclaimer

Your feature folder name (FeatureFolderOptions.FeatureFolderName or AreaFeatureFolderOptions.AreaFolderName if using Areas) cannot be in your project namespace.

See: Issue #27

Using areas

If you want to enable areas, there are two pieces of code to add:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
                .AddFeatureFolders()
                .AddAreaFeatureFolders();
    
        // "Features" is the default feature folder root. To override, pass along 
        // a new FeatureFolderOptions object with a different FeatureFolderName
    }
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        app.UseDeveloperExceptionPage();
        app.UseMvcWithDefaultRoute().UseMvc(routes => 
            routes.MapRoute(
                name: "areaRoute",
                template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"));
    }

The first piece is to add the .AddAreaFeaturesFolders() after the .AddFeatureFolders(). This adds the view locations for the areas. The second part is another .UseMvc() method to configure the route to area controllers.

Now areas can be added using the default area layout combined with the feature folder setup. Example:

/Areas
    /Administration // this is the area name
        /Overview   // this is the controller name
            /OverviewController.cs
            /Index.cshtml

If ReSharper (or Rider) is being annoying

Then add the package JetBrains.Annotations to the web app project and add the following lines above the Startup class between the using statements and the namespace.

[assembly: AspMvcViewLocationFormat(@"~\Features\{1}\{0}.cshtml")]
[assembly: AspMvcViewLocationFormat(@"~\Features\{0}.cshtml")]
[assembly: AspMvcViewLocationFormat(@"~\Features\Shared\{0}.cshtml")]

[assembly: AspMvcAreaViewLocationFormat(@"~\Areas\{2}\{1}\{0}.cshtml")]
[assembly: AspMvcAreaViewLocationFormat(@"~\Areas\{2}\Features\{1}\{0}.cshtml")]
[assembly: AspMvcAreaViewLocationFormat(@"~\Areas\{2}\{0}.cshtml")]
[assembly: AspMvcAreaViewLocationFormat(@"~\Areas\{2}\Shared\{0}.cshtml")]

Replace 'Features' and 'Areas' part if you set a custom folder name.

You can’t perform that action at this time.