asp.net mvc 3, Темы (разные взгляды) - PullRequest
2 голосов
/ 30 января 2012

Я хочу добавить темы на свой сайт, которые будут использовать совершенно разные виды. Я хочу видеть их в своем проекте так:

Views/Theme1/...
Views/Theme2/...

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

Views/...

И потому мне нужен простой способ переключения между ними.

Итак, вопрос: как я могу заставить ViewEngine искать представления в определенном месте, упомянутом, например, в web.config?

Добавлена ​​

Решил базовую проблему с этим, спасибо Арчилу:

public class ThemedRazorViewEngine : RazorViewEngine
{
    public ThemedRazorViewEngine(string themeName)
    {
        MasterLocationFormats = new string[] { "~/Views/" + themeName + "/Shared/{0}.cshtml" };
        PartialViewLocationFormats = new string[] { "~/Views/" + themeName + "/{1}/{0}.cshtml" };
        ViewLocationFormats = new string[] { "~/Views/" + themeName + "/{1}/{0}.cshtml" };
    }
}

Все хорошо, но «правый клик -> перейти к просмотру» больше не работает (побочный эффект, ничего страшного).

А теперь у меня возник другой вопрос: на веб-сайте у нас есть панель администрирования, которая должна быть независимой от темы. Как я могу это исправить? иметь что-то вроде этого:

Views/Admin/...
Views/Theme1/...
Views/Theme2/...

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Самое простое решение для значения темы в web.config - это создание собственного ViewEngine и переопределение только мест просмотра поиска. Таким образом, вам не нужно ничего менять в Контроллере (Пример использует только файлы cshtml для механизма просмотра только c #, вы должны добавить расширения vbhtml, если вы хотите использовать визуальные базовые представления)

public class ThemedRazorViewEngine : RazorViewEngine
{
    public ThemedRazorViewEngine(string themeName)
    {
        AreaMasterLocationFormats = new string[] { "~/Areas/{2}/Views/ " + themeName + "/{1}/{0}.cshtml", "~/Areas/{2}/Views/Shared/" + themeName + "/{0}.cshtml" };

        //and same for all of below
        AreaPartialViewLocationFormats = new string[] { "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.cshtml" };
        AreaViewLocationFormats = new string[] { "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.cshtml" };
        FileExtensions = new string[] { "cshtml" };
        MasterLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" };
        PartialViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" };
        ViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" };
    }
}

И регистрация вида двигателя

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new ThemedRazorViewEngine(ConfigurationManager.AppSettings["currentTheme"]));
2 голосов
/ 30 января 2012

как я могу заставить ViewEngine искать представления в определенном месте упоминается.

Вам необходимо указать путь в методе View:

return View("~/Views/Theme1/Index");
return View("~/Views/Theme2/Index");

А для примера web.config:

var themeFromWebConfig = GetThemeFromWebConfig();
var viewName = "~/Views/" + themeFromWebConfig + "/Index";
return View(viewName);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...