Spark View Engine: как установить имя главной страницы по умолчанию?

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

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

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

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

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


person davehauser    schedule 28.12.2010    source источник


Ответы (3)


Есть два способа решить вашу проблему:

  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 должен искать главные представления и каковы будут их имена.

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

person RobertTheGrey    schedule 28.12.2010
comment
Подход «Больше работы» также можно использовать для создания тематической системы (CMS, блог и т. Д.). - person detroitpro; 29.12.2010
comment
Спасибо, Роберт, это здорово! Я думаю, что подход «Меньше работы» даже хуже, чем установка мастера в каждом представлении, поэтому я выбрал «Больше». Это действительно чистое (и расширяемое) решение. - person davehauser; 29.12.2010
comment
Я не мог с этим согласиться - я даже не мог вспомнить, как использовать вариант «Меньше работы» - пришлось поискать ;-). Я не поклонник каких-либо волшебных строк, бегающих по коду, если я могу помочь, но они существуют для совместимости с собственными WebForms, так что вы собираетесь делать? Рад, что вы выбрали второй вариант, на самом деле это меньше работы в долгосрочной перспективе ;-) - person RobertTheGrey; 29.12.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'"/>

Еще одна крутая функция

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

Вместо того, чтобы писать

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

person jgauffin    schedule 28.12.2010
comment
Спасибо за Ваш ответ. Добавление <use master="Default" /> в _global.spark, к сожалению, не сработало - я пробовал это раньше. Да, я знаю некоторые другие интересные функции Spark, но я в этом не новичок. И помимо чистого синтаксиса, я люблю Spark благодаря этим небольшим дополнениям! :-) - person davehauser; 29.12.2010

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

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

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

person sianabanana    schedule 30.01.2012