Updated: 2020-05-03. Thanks to Luke in the comments for his tip about Partial Views.
I’ve had a handful of people ask me about this, so I figured I’d just blog on it.
The Problem
If you use Feature Folders in ASP.NET Core you may see something like this where Resharper can’t figure out where your Views are. It will outline your View() calls in red (as well as your partials).
When you run the app it still works, but it leaves a little to be desired with the Developer experience. Feature Folders are supported in Resharper and plain ASP.NET, but in ASP.NET Core Resharper has not added support for Feature Folders yet.
The Fix
Luckily, there’s a workaround, that I was first notified of by Bill Sorensen on my blog post on Feature Folders linked above.
1. Install the JetBrains.Annotations NuGet package
2. Add the following attributes to the top of your IViewLocationExpander file, above the namespace*
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[assembly: AspMvcViewLocationFormat("~/Features/{1}/{0}.cshtml")] | |
[assembly: AspMvcViewLocationFormat("~/Features/Shared/{0}.cshtml")] | |
[assembly: AspMvcPartialViewLocationFormat("~/Features/{1}/{0}.cshtml")] | |
[assembly: AspMvcPartialViewLocationFormat("~/Features/Shared/{0}.cshtml")] |
3. Re-open your Controller and everything should work
- Note – if you have more custom paths in your
IViewLocationExpander
than just those, then you’ll have to add those routes as well.
So your final output should look something like this:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections.Generic; | |
using JetBrains.Annotations; | |
using Microsoft.AspNetCore.Mvc.Razor; | |
// These annotations make Resharper not complain about not finding the Views. | |
// ASP.NET Core support coming to R# for Feature Folders soon – https://youtrack.jetbrains.com/issue/RSRP-461882 | |
[assembly: AspMvcViewLocationFormat("/Features/{1}/{0}.cshtml")] | |
[assembly: AspMvcViewLocationFormat("/Features/Shared/{0}.cshtml")] | |
[assembly: AspMvcPartialViewLocationFormat("~/Features/{1}/{0}.cshtml")] | |
[assembly: AspMvcPartialViewLocationFormat("~/Features/Shared/{0}.cshtml")] | |
namespace WebApplication1.Infrastructure.StartupCustomizations | |
{ | |
public class FeatureFolderLocationExpander : IViewLocationExpander | |
{ | |
public void PopulateValues(ViewLocationExpanderContext context) | |
{ | |
// Don't need anything here, but required by the interface | |
} | |
public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations) | |
{ | |
// The old locations are /Views/{1}/{0}.cshtml and /Views/Shared/{0}.cshtml where {1} is the controller and {0} is the name of the View | |
// Replace /Views with /Features | |
return new[] | |
{ | |
"/Features/{1}/{0}.cshtml", | |
"/Features/Shared/{0}.cshtml" | |
}; | |
} | |
} | |
} |
That’s it, now Resharper is happy!
Hope this helps.