Hopefully I've done it now by providing a custom view engine that inherits from the razor view engine and simply adds the view locations to search through:
using System.Linq;
using System.Web.Mvc;
namespace MvcApplication1
{
public class CustomViewEngine : RazorViewEngine
{
public CustomViewEngine()
: this(null)
{
}
public CustomViewEngine(IViewPageActivator activator)
: base(activator)
{
var partialViewLocationFormatsList = PartialViewLocationFormats.ToList();
partialViewLocationFormatsList.Add("~/Views/{1}/DisplayTemplates/{0}.cshtml");
partialViewLocationFormatsList.Add("~/Views/{1}/EditorTemplates/{0}.cshtml");
partialViewLocationFormatsList.Add("~/Views/Shared/DisplayTemplates/{0}.cshtml");
partialViewLocationFormatsList.Add("~/Views/Shared/EditorTemplates/{0}.cshtml");
PartialViewLocationFormats = partialViewLocationFormatsList.ToArray();
var areaPartialViewLocationFormatsList = AreaPartialViewLocationFormats.ToList();
areaPartialViewLocationFormatsList.Add("~/Areas/{2}/Views/{1}/DisplayTemplates/{0}.cshtml");
areaPartialViewLocationFormatsList.Add("~/Areas/{2}/Views/{1}/EditorTemplates/{0}.cshtml");
areaPartialViewLocationFormatsList.Add("~/Areas/{2}/Views/Shared/DisplayTemplates/{0}.cshtml");
areaPartialViewLocationFormatsList.Add("~/Areas/{2}/Views/Shared/EditorTemplates/{0}.cshtml");
AreaPartialViewLocationFormats = areaPartialViewLocationFormatsList.ToArray();
}
}
}
And then registered it in Global.asax :
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CustomViewEngine());