2013-03-07 4 views
4

У меня есть проект MVC, который требует наличия двух разных папок Просмотр. Один из них - ~/Views/ и один - ~/Framework/Views/. Это делается путем создания пользовательского вида двигателя на основе обзора бритвы двигатель, как это:ASP.NET MVC: Папки с несколькими представлениями и файл _ViewStart.cshtml

public class MyViewEngine : RazorViewEngine 
{ 
    private static string[] AdditionalViewLocations = new[]{ 
     "~/Framework/Views/{1}/{0}.cshtml", 
     "~/Framework/Views/{1}/{0}.vbhtml", 
     "~/Framework/Views/Shared/{0}.cshtml", 
     "~/Framework/Views/Shared/{0}.vbhtml" 
    }; 

    public MyViewEngine()    
    { 
     base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(AdditionalViewLocations).ToArray(); 
     base.ViewLocationFormats = base.ViewLocationFormats.Union(AdditionalViewLocations).ToArray(); 
     base.MasterLocationFormats = base.MasterLocationFormats.Union(AdditionalViewLocations).ToArray(); 
    } 
} 

Проблема заключается в том, что я хочу использовать другой файл _ViewStart.cshtml в каждой папке 2 Views (т.е. ~/Views/_ViewStart.cshtml для просмотры, найденные в папке ~/Views/ и ~/Framework/Views/_ViewStart.cshtml для видов, найденных в папке ~/Framework/Views/), однако View Engine использует только первый найденный, который является оригинальным в ~/Views/.

Это можно сделать?

Спасибо

+0

Почему бы не использовать районы вместо того, чтобы возиться с движком просмотра? –

+1

Это определенно возможно - на самом деле я просто взбивал его на своей машине, используя предоставленный вами механизм просмотра, просто скопированный и вставленный. Я не вижу такого же поведения, как вы. У меня есть два файла _ViewStart, один в ~/Framework/Views/_ViewStart.cshtml и один в ~/Views/_ViewStart.cshtml. Когда я запускаю представление в ~/Framework/Views /, он использует Framework _ViewStart. Когда я запускаю представление в ~/Views /, он использует _ViewStart. Двойная проверка кода в RazorViewEngine с использованием DotPeek также подтверждает, что так оно и должно быть. Вы уверены, что у вас что-то не хватает? – 2013-03-07 23:32:44

+1

@NickAceves: Спасибо, что ты прав. Мой файл был сохранен в неправильном месте, и дубликат неправильного файла был сохранен в нужном месте! Что за dooch! Еще раз спасибо. (поставьте его в ответ, и я отметю его) – hofnarwillie

ответ

6

Это, безусловно, возможно, я думаю, вы просто что-то пропустили.

Я сам испытал это, используя предоставленный вами механизм просмотра (скопированный и вставленный дословно). Я не вижу такого же поведения, как вы. У меня есть два файла _ViewStart.cshtml, один на ~/Framework/Views/_ViewStart.cshtml и один на ~/Views/_ViewStart.cshtml.

Когда я запустил представление в пределах ~/Framework/Views/, он использует _ViewStart.cshtml в папке Framework. Когда я запускаю представление в пределах ~/Views/, он использует _ViewStart.cshtml в папке «Представления».

Двойная проверка кода в RazorViewEngine с использованием DotPeek также подтверждает, что это именно то, как должно себя вести. Механизм просмотра начинает проверку на файл с именем _ViewStart.cshtml в той же папке, что и визуализируемое представление, а затем поднимается до дерева каталогов, пока не попадет в корень приложения.

2

Выбор _ViewStart является иерархической, но вы добавили ~/Framework/Views параллельно ~/Views. Я не думаю, что Razor настроен на то, чтобы делать то, что вы хотите (т. Е. Два полностью параллельных представления). Если вы положили Framework в основную папку Views, то ваши _ViewStart s будут загружаться должным образом.

+0

Я вижу, да. Таким образом, каталог framework будет выглядеть примерно так: '~/Views/Framework/_ViewStart.cshtml' и' ~/Views/Framework/Controller/Action.cshtml'. И пользовательский механизм просмотра бритвы тогда все еще нуждался, но изменяя дополнительные элементы видимости на что-то вроде этого: '' ~/Views/Framework/{1}/{0} .cshtml "'? – hofnarwillie

+0

Или это все еще параллельные местоположения? Должен ли я просто добавить папку Framework в качестве области? (Раньше не использовали области, поэтому извините, если я не понимаю) – hofnarwillie

+0

Нет, это именно то, о чем я говорю.Если вы поместите все ваши представления «Framework» вместе в папку и поместите «_ViewStart» в эту папку, тогда он будет применяться ко всему на этом уровне и ниже. Подумайте об этом как о переопределении. Вам больше не понадобится специальный бритвенный двигатель. –