Почему для работы необходимо наличие представления MVC в каталоге View? - PullRequest
4 голосов
/ 03 февраля 2011

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

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

По моим правилам каждый проект должен иметь уникальный код, связанный с 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?

Ответы [ 2 ]

7 голосов
/ 03 февраля 2011

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

4 голосов
/ 03 февраля 2011

По умолчанию 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"
};
...