Spark View Engine: Как установить имя главной страницы по умолчанию? - PullRequest
2 голосов
/ 28 декабря 2010

Я использую Spark View Engine с вложенными главными страницами.У меня есть Application.spark, который определяет основной макет сайта.Затем есть несколько других мастеров, которые сами используют Application.spark в качестве главной страницы (Default.spark, SinlgeColumn.spark, Gallery.spark, ...)

Если в файле представления не указана главная страница, тоApplication.spark автоматически выбирается Spark View Engine.Поскольку почти все мои страницы используют «Default.spark» в качестве основного, есть ли способ настроить это глобально?

Другие возможности будут:

  1. Установить мастерв каждом файле спарка индивидуально <use master="Default" />.Но это действительно раздражает.

  2. Переименуйте мои главные файлы (Default.spark <-> Application.spark), но это действительно не имеет никакого смысла в именовании.

Ответы [ 3 ]

4 голосов
/ 28 декабря 2010

Существует два способа решения вашей проблемы:

  1. Меньше работы - но больше повторений.
  2. Больше работы, но изгоняет предпочитаемое соглашение.

Меньше работы

С любым ActionResult вы можете просто добавить второй параметр в оператор return, чтобы указать имя используемого мастера:

return View("Gallery", "Default");

первое имя параметра - это представление, а второе означает переопределение главной страницы ... но это означает, что вам нужно повторять его везде, и это не намного лучше, чем было раньше.

Больше работы

Способ, которым Spark находит главную страницу для использования, заключается в следующем коде в рамках:

protected virtual IEnumerable<string> PotentialDefaultMasterLocations(string controllerName, IDictionary<string, object> extra)
    {
        return ApplyFilters(new[]
                                {
                                    "Layouts\\" + controllerName + ".spark",
                                    "Shared\\" + controllerName + ".spark",
                                    "Layouts\\Application.spark",
                                    "Shared\\Application.spark"
                                }, extra);
    }

Обратите внимание на в жестком коде Application.spark там - это соглашение Spark. Похоже, что вы хотите сделать, это переопределить этот метод и вставить что-то вроде этого:

protected virtual IEnumerable<string> PotentialDefaultMasterLocations(string controllerName, IDictionary<string, object> extra)
    {
        return ApplyFilters(new[]
                                {
                                    "Layouts\\" + controllerName + ".spark",
                                    "Shared\\" + controllerName + ".spark",
                                    "Layouts\\Default.spark",
                                    "Shared\\Default.spark"
                                    "Layouts\\Application.spark",
                                    "Shared\\Application.spark"
                                }, extra);
    }

Тогда он найдет ваш Default.spark, прежде чем найдет Application.spark, или вы можете полностью избавиться от Application.spark, если он вам не подходит, и вы предпочитаете свои условности ...

Чтобы переопределить это, все, что вам нужно сделать, это создать класс, который наследует от Spark.Web.Mvc.DefaultDescriptorBuilder, и переопределить этот метод, упомянутый выше, и использовать его при регистрации движка представления следующим образом:

public static void RegisterViewEngine(ICollection<IViewEngine> engines)
{
    var services = SparkEngineStarter.CreateContainer();
    services.SetServiceBuilder<IDescriptorBuilder>(
        c => new MyDescriptorBuilder());
    SparkEngineStarter.RegisterViewEngine(services);
}

Теперь это означает, что теперь вы можете указывать, где Spark должен искать основные виды и какими будут имена.

Надеюсь, это поможет,
Всего наилучшего,
RobertTheGrey

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

Вместо использования Application.spark в качестве базы и Default.spark в качестве 2-го уровня ... переименуйте Default.spark в Application.spark, а application.spark - в другое, например BaseApplication.spark.

Таким образом, по умолчанию ваш application.spark выбран, но если вы хотите переопределить его, вы можете сослаться на BaseApplication.spark.

См. Пример трехпроходного рендеринга.http://sparkviewengine.com/documentation/master-layouts#Threepassrendering

0 голосов
/ 28 декабря 2010

Не знаю, работает ли это, но попробуйте добавить

<use master="Default" />

в файле с именем Views\_global.spark. Он автоматически включается во все виды.

Я обычно добавляю пространства имен и глобальные переменные к моим _global.spark.

Пример:

<use namespace="System.Collections.Generic"/>
<use namespace="System.Web.Mvc.Html"/>

<global type="string" Title="'My default title'"/>

Еще одна интересная особенность

Поскольку вы являетесь новым пользователем свечей, я хотел бы показать вам еще одну замечательную функцию зажигания.

Вместо написания

Html.LabelFor(Model => Model.FirstName);

Вы можете написать

<Label For="FirstName" />

Делает взгляды чище, а? Магия делается с помощью чего-то, что называется связыванием. Все, что вам нужно сделать, это создать файл Views\Bindings.xml и добавить к нему привязки.

Подробнее в этой записи блога: http://blog.robertgreyling.com/2010/08/spark-bindings-are-you-tired-of-eating.html

...