вторник, 25 октября 2011 г.

Создание Razor-функций в C1

Razor обычно ассоциируется с MVC. В C1 MVC поддерживается  благодаря "MVC-плееру". И соответственно, поддерживается синтаксис Razor.

Благодаря усилиям сообщества C1 появилась поддержка Razor в C1 без MVC в качестве стандартных C1-функций.

Сразу скажу, что создание Razor-функции отличается от создания той же XSLT-функции. Не используется графический редактор функций. (Вероятно, в будущем ситуация изменится.)  А вот использование - такое же, как и любой другой функции в C1.

Итак, как же добавить поддержку Razor-функций в C1?


Для этого нужно установить пакет расширения Contribution.CompositeC1Contrib.RazorFunctions - прямо из админки C1. Пакет также доступен здесь - от автора.

После установки пакета вы можете создавать функции в папке  ~/App_Data/Razor как .cshtml файлы по принципу "один файл - одна функция". Создавать можно в Visual Studio, например. C1 будет подхватывать добавления и изменения .cshtml файлов на лету.

Функции поддерживают входные параметры и по умолчанию возвращают значение типа XhtmlDocument. (Тип возвращаемого значения можно изменить.)

Они должны наследоваться от CompositeC1Contrib.RazorFunctions.CompositeC1WebPage, которая в свою очередь наследуется от System.Web.WebPages.WebPage. Благодаря этому у вас есть доступ к обычным helper-методам и свойствам (Html, Context, Layout, Page, PageData) , ну, и вообще, к .NET Framework'у. Однако не поддерживаются Model or Controllers потому, что это не MvcWebPage.

Благодаря наследованию от CompositeC1WebPage, есть также доступ к типам и т.п. в C1 через Composite.Data и к CurrentPageNode ("узел" текущей страницы).

После установки пакета, в папке ~/App_Data/Razor, появятся несколько .cshtml файлов в качестве примеров использования синтаксиса Razor и функционала C1.


Создание Razor-функции
  1. В папке  ~/App_Data/Razor, создайте подпапки, которые будут служить пространством имен для вашей функции...
  2. ... и в подпапке - .cshtml файл, - выбрав для него имя, которое будет показываться при добавлении вашей Razor функции в интерфейсе пользователя.
    То есть, если вы добавите функцию как ~/App_Data/Razor/My/Razor/Function.cshtml, то она будет доступна в админке как My.Razor.Function.
  3. Если вы создаете .cshtml файл, используя шаблон из Visual Studio, то в нем будет указан тип документа  <!DOCTYPE html>. Этот элемент нужно удалить!
  4. Добавьте наследование от старницы C1 вот так: @inherits CompositeC1Contrib.RazorFunctions.CompositeC1WebPage
  5. При использовании системы данных C1 укажите использование Composite.Data@using Composite.Data
  6. И конечно добавьте ваш код.
Например:

@inherits CompositeC1Contrib.RazorFunctions.CompositeC1WebPage

@using Composite.Data;

<div id="Sitemap">
  @NavigationTree(@HomePageNode.ChildPages, 5)
</div>

@helper NavigationTree(IEnumerable<PageNode> pages, int endRenderLevel)
{
  if (pages.Any() && pages.First().Level <= endRenderLevel)
  {
    <ul class  ="sitemapLevel@(pages.First().Level)">
      @foreach   (var subPage in pages)
      {
        if (!String.IsNullOrWhiteSpace(subPage.MenuTitle))
        {
          <li>
            <a href="@(subPage.Url)">@subPage.MenuTitle</a>
            @NavigationTree(subPage.ChildPages, endRenderLevel)
          </li>
        }
      }
    </ul>
  }
}

После сохранения ваша функция станет доступна для выбора в окне для вставки функции, (например, при добавлении на страницу).

Далее мы рассмотрим, как добавлять входные параметры в Razor-функции и как изменить тип возвращаемого значения.

Комментариев нет:

Отправить комментарий