Как указать маршрут к общим представлениям в MVC3 при использовании областей - PullRequest
0 голосов
/ 16 июня 2011

У меня есть приложение MVC3 / Razor, использующее области, в которых мои представления находятся в следующем месте:

/ Области / Имя_области / Представления / ControllerName / view.cshtml

Прямо сейчас, длялюбые общие партиалы, я должен поместить их здесь:

/Views/Shared/_sharedview.cshtml

Я бы предпочел, чтобы мои общие представления были здесь:

/Areas/Shared/Views/_sharedvew.cshtml

Есть ли способ заставить механизм просмотра искатьгде-то, кроме расположения по умолчанию для общих представлений?

Я думаю что-то вроде этого:

routes.MapRoute("Shared", "Areas/Shared/Views/{id}");

Спасибо!

1 Ответ

0 голосов
/ 16 июня 2011

Я обычно спускаю класс из VirtualPathProvider

. Узнайте здесь больше:

http://coderjournal.com/2009/05/creating-your-first-mvc-viewengine/

и зарегистрируйте его при запуске:

HostingEnvironment.RegisterVirtualPathProvider(new EmbeddedViewPathProvider());

Вам не нужно иметь дело с путями, которые находятся за пределами вашей области, так как вы можете передать функцию в базовом определении, как я делаю здесь, в этом поставщике встроенного пути просмотра:

  public class EmbeddedViewPathProvider: VirtualPathProvider
    {
        static EmbeddedViewPathProvider()
        {
            ResourcePaths = new Dictionary<string, ViewResource>();
            foreach (var resource in SettingsManager.Get<CoreSettings>().Assemblies.Select(assembly => new ViewResource
                                                                                                           {
                                                                                                               VirtualPath = "/views/embedded/" + assembly.ToLower(), AssemblyName = assembly
                                                                                                           }))
            {
                AddResource(resource);
            }
        }

        public static void AddResource(ViewResource assemblyResource)
        {
            ResourcePaths.Add(assemblyResource.VirtualPath, assemblyResource);
        }
        private static Dictionary<string, ViewResource> ResourcePaths { get; set; }

        public bool IsAppResourcePath(string virtualPath)
        {

            var checkPath = VirtualPathUtility.ToAppRelative(virtualPath).ToLower();
            return ResourcePaths.Any(resourcePath => checkPath.Contains(resourcePath.Key) && ResourceExists(resourcePath.Value, checkPath));
        }

        private static bool ResourceExists(ViewResource assemblyResource, string path)
        {
            var name = assemblyResource.GetFullyQualifiedTypeFromPath(path);
            return Assembly.Load(assemblyResource.AssemblyName).GetManifestResourceNames().Any(s => s.ToLower().Equals(name));
        }


        public ViewResource GetResource(string virtualPath)
        {
            var checkPath = VirtualPathUtility.ToAppRelative(virtualPath).ToLower();
            return (from resourcePath in ResourcePaths where checkPath.Contains(resourcePath.Key) select resourcePath.Value).FirstOrDefault();
        }

        public override bool FileExists(string virtualPath)
        {
            var exists = base.FileExists(virtualPath);
            return exists || IsAppResourcePath(virtualPath);
        }

        public override VirtualFile GetFile(string virtualPath)
        {
            if (IsAppResourcePath(virtualPath) && !base.FileExists(virtualPath))
            {
                var resource = GetResource(virtualPath);
                return new ViewResourceVirtualFile(virtualPath, resource);
            }
            return base.GetFile(virtualPath);

        }

        public override CacheDependency
            GetCacheDependency(string virtualPath,
                               IEnumerable virtualPathDependencies,
                               DateTime utcStart)
        {
            if (IsAppResourcePath(virtualPath))
            {
                return null;
            }
            var dependencies = virtualPathDependencies.OfType<string>().Where(s => !s.ToLower().Contains("/views/embedded")).ToArray();
            return base.GetCacheDependency(virtualPath, dependencies, utcStart);

        }

        public override string GetCacheKey(string virtualPath)
        {
            return null;
        }

    }
...