2011-02-03 4 views
4

Я пишу cms с MVC, который используется в качестве основного механизма для создания страниц.Почему представление MVC должно существовать в каталоге View для работы?

У меня все хорошо, но мне нужна была возможность создать уникальный шаблон бритвы для каждого сайта и, возможно, для представления, если нужно.

Мои правила заключаются в том, что каждый проект должен иметь уникальный код, который связан с URL-адресом.

Активы для каждого сайта проекта хранятся таким образом, что местоположение относится к проекту.

Таким образом, активы, связанные с проектом C0001, будут храниться в assets\C0001\ и для C0002: assets\C0002\ и так далее.

Что я хотел сделать, чтобы сохранить порядок вещей, было иметь шаблоны бритвы, связанные с проектом, расположенным в местоположении assets\[ProjectCode], но проблема в том, что я получаю сообщение об ошибке ViewBag not existing in context.

Так что это не будет работать:

Layout = string.Concat("~/assets/",ViewBag.ProjectNumber,"/_Layout.cshtml"); 

Где, как следующий будет оказывать страницу:

Layout = string.Concat("~/Views/Shared/_",ViewBag.ProjectNumber,"Layout.cshtml"); 

Я предполагаю, что первый макет оленьей кожи делает, потому что он находится за пределами познаваемого искать области для просмотров? Но, как я говорю, где находится файл, я не понимаю, в чем проблема?

Я счастлив работать с кодом, приведенным в примере 2, но может означать, что после небольшого количества сайтов проекта общий вид видов будет очень занят.

Просто интересно, есть ли причина, по которой виды должны существовать в каталоге Views?

+0

Вы должны использовать области. – SLaks

+0

@marcind: ваше право, спасибо за исправление –

ответ

7

Вам нужно скопировать файл web.config, который находится в вашем Views каталоге и поместить копию в Assets каталоге. Поскольку вам нужно предоставить полный путь для макетов, это не проблема пути поиска, ему нужна информация в web.config для правильной инициализации представления.

+0

Спасибо, это сработало, оно прекратило рендеринг css, но отображение представления так, что это шаг в правильном направлении. –

+0

С web.config на месте, он не будет обслуживать файлы css из этих каталогов (я не понял почему). Так что, к сожалению, вам понадобится pus css в отдельном дереве каталогов – Clicktricity

+0

Получил эту работу; найти и изменить httphandler, поэтому глагол показывает следующее: '', поэтому он будет искать файлы просмотра, оставит только остальное –

4

По умолчанию RazorViewEngine настроен для просмотра в каталоге Views.

Вы можете изменить это, создав свой собственный экземпляр RazorViewEngine с различными путями и добавив его в ViewEngines.Engines.

его по умолчанию пути являются

AreaViewLocationFormats = new[] { 
    "~/Areas/{2}/Views/{1}/{0}.cshtml", 
    "~/Areas/{2}/Views/{1}/{0}.vbhtml", 
    "~/Areas/{2}/Views/Shared/{0}.cshtml", 
    "~/Areas/{2}/Views/Shared/{0}.vbhtml" 
}; 
AreaMasterLocationFormats = new[] { 
    "~/Areas/{2}/Views/{1}/{0}.cshtml", 
    "~/Areas/{2}/Views/{1}/{0}.vbhtml", 
    "~/Areas/{2}/Views/Shared/{0}.cshtml", 
    "~/Areas/{2}/Views/Shared/{0}.vbhtml" 
}; 
AreaPartialViewLocationFormats = new[] { 
    "~/Areas/{2}/Views/{1}/{0}.cshtml", 
    "~/Areas/{2}/Views/{1}/{0}.vbhtml", 
    "~/Areas/{2}/Views/Shared/{0}.cshtml", 
    "~/Areas/{2}/Views/Shared/{0}.vbhtml" 
}; 

ViewLocationFormats = new[] { 
    "~/Views/{1}/{0}.cshtml", 
    "~/Views/{1}/{0}.vbhtml", 
    "~/Views/Shared/{0}.cshtml", 
    "~/Views/Shared/{0}.vbhtml" 
}; 
MasterLocationFormats = new[] { 
    "~/Views/{1}/{0}.cshtml", 
    "~/Views/{1}/{0}.vbhtml", 
    "~/Views/Shared/{0}.cshtml", 
    "~/Views/Shared/{0}.vbhtml" 
}; 
PartialViewLocationFormats = new[] { 
    "~/Views/{1}/{0}.cshtml", 
    "~/Views/{1}/{0}.vbhtml", 
    "~/Views/Shared/{0}.cshtml", 
    "~/Views/Shared/{0}.vbhtml" 
}; 
+0

Спасибо. Это было именно то, что мне нужно. Когда я зарегистрировал собственный экземпляр «RazorViewEngine» в «Global.asax # Application_Start()», я даже получил поддержку intellisense для моих настраиваемых путей просмотра. Очень полезно. –