{"action":"created","issue":{"url":"https://api.github.com/repos/bem/bem-forum-content-ru/issues/1048","repository_url":"https://api.github.com/repos/bem/bem-forum-content-ru","labels_url":"https://api.github.com/repos/bem/bem-forum-content-ru/issues/1048/labels{/name}","comments_url":"https://api.github.com/repos/bem/bem-forum-content-ru/issues/1048/comments","events_url":"https://api.github.com/repos/bem/bem-forum-content-ru/issues/1048/events","html_url":"https://github.com/bem/bem-forum-content-ru/issues/1048","id":161529590,"number":1048,"title":"Продолжаем скрещивать БЭМ и .NET","user":{"login":"dima117","id":5608639,"avatar_url":"https://avatars.githubusercontent.com/u/5608639?v=3","gravatar_id":"","url":"https://api.github.com/users/dima117","html_url":"https://github.com/dima117","followers_url":"https://api.github.com/users/dima117/followers","following_url":"https://api.github.com/users/dima117/following{/other_user}","gists_url":"https://api.github.com/users/dima117/gists{/gist_id}","starred_url":"https://api.github.com/users/dima117/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dima117/subscriptions","organizations_url":"https://api.github.com/users/dima117/orgs","repos_url":"https://api.github.com/users/dima117/repos","events_url":"https://api.github.com/users/dima117/events{/privacy}","received_events_url":"https://api.github.com/users/dima117/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/bem/bem-forum-content-ru/labels/bemhtml","name":"bemhtml","color":"bfe5bf"},{"url":"https://api.github.com/repos/bem/bem-forum-content-ru/labels/community","name":"community","color":"fef2c0"},{"url":"https://api.github.com/repos/bem/bem-forum-content-ru/labels/ide","name":"ide","color":"c7def8"},{"url":"https://api.github.com/repos/bem/bem-forum-content-ru/labels/project-stub","name":"project-stub","color":"bfe5bf"},{"url":"https://api.github.com/repos/bem/bem-forum-content-ru/labels/tools","name":"tools","color":"c7def8"}],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":3,"created_at":"2016-06-21T20:18:28Z","updated_at":"2016-06-21T21:58:18Z","closed_at":null,"body":"Когда мы скрещивали БЭМ и .NET в [прошлый раз](https://ru.bem.info/forum/1007/), на выходе получили зачатки библиотеки для bemhtml-шаблонизации в приложениях ASP.NET MVC. За прошедший месяц библиотека выросла в [NuGet пакет](https://www.nuget.org/packages/system.web.bem), содержащий всё необходимое для БЭМ-разработки на .NET.\r\n\r\n## Что изменилось\r\n1. **Библиотека переименовалась в `System.Web.Bem`**, по аналогии с `System.Web.Mvc`\r\n\r\n1. **Вместо gulp для сборки теперь используется enb.** Как я и писал в прошлый раз, gulp-плагины для БЭМ-сборки еще довольно \"сырые\". Кроме того, их код написан на  ES6 (используются промисы, новый синтаксис и т.д.). Из-за этого при запуске gulp-сборки в Visual Studio есть *особенности*, из-за которых настройка сборки кажется очень сложной неподготовленному человеку. Решено было выпилить gulp и заменить его на enb, который хорошо протестирован и не требует поддержки ES6.\r\n\r\n1. **Появился механизм мэппинга http-запросов на БЭМ бандлы** и его настройки вынесены в конфиг приложения (`Web.config`). Секция конфига должна называться `bemSettings`. C её помощью можно задать путь к папке с бандлами (по умолчанию `~/Bem/desktop.bundles`) и используемый алгоритм выбора бандла для текущего запроса. Пример:\r\n  ```xml\r\n  <bemSettings RootDir=\"~/Bem/public\" Mapper=\"Single\" />\r\n  ```\r\n1. **Добавлены хелперы для view**, с помощью которых можно внутри Razor-view отрендерить bemhtml шаблон. Например, на этой [тестовой страничке](http://bemtest.ecm7.ru/Default/Test) начало и конец страницы отрендерены с помощью Razor (и там кодом на C# выводится текущее время), а блок с селекторами отрендерен с помощью bemhtml (в шаблоне это [выглядит так](https://github.com/dima117/bemtest-net/blob/master/WebApplication/Views/Default/Test.cshtml#L15)).\r\n \r\n1. **Всё это дело оформлено в виде NuGet пакета и [опубликовано](https://www.nuget.org/packages/system.web.bem)**. При установке пакета \r\n  - в проект из npm ставятся enb и нужные для сборки enb-технологии, \r\n  - добавляется папка Bem с файловой структурой БЭМ проекта и конфигом для enb, \r\n  - в конфиг MsBuild добавляется дополнительный этап сборки - запуск enb; таким образом при компиляции C# в Visual Studio выполняется также и сборка БЭМ-бандлов\r\n  - в проект подключается C# библиотека для серверной шаблонизации\r\n\r\n1. **В NuGet выложены библиотеки блоков [bem-core](https://www.nuget.org/packages/bem-core/) и [bem-components](https://www.nuget.org/packages/bem-components/)**\r\n\r\n## Быстрый старт\r\n1. Устанавливаем в свой проект ASP.NET MVC пакет [System.Web.Bem](https://www.nuget.org/packages/system.web.bem). Это можно сделать через [UI менеджера пакетов](https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/65/69/2352.Capture.PNG) (не забываем отметить галочку \"Include prerelease\") или через консоль: `nuget install System.Web.Bem -Prerelease`.\r\n1. Добавляем нужные блоки в папку `Bem/desktop.blocks` и добавляем их в декларацию `Bem/desktop.bundles/default/default.bemdecl.js` (по умолчанию в настройках указано собирать весь проект в один бандл с именем `default`).\r\n1. В желаемом методе контроллера возвращаем экземпляр класса `System.Web.Bem.BemhtmlResult` и передаем ему в конструкторе bemjson (например, [вот так](https://github.com/dima117/bemtest-net/blob/master/WebApplication/Controllers/DefaultController.cs#L11-L17))\r\n1. Собираем проект в Visual Studio, запускаем, открываем нужный url и наслаждаемся видом наших блоков :)\r\n1. Если очень хочется, можно подключить [bem-components](https://www.nuget.org/packages/bem-components/) и использовать блоки оттуда. Подключение происходит аналогичным образом, только название пакета другое - `bem-components`. После установки пакета файлы блоков будут добавлены в папку `Bem/libs`. Нужно подключить папки с файлами как уровни переопределения в конфиг enb (должно получиться [примерно так](https://github.com/dima117/bemtest-net/blob/master/WebApplication/Bem/.enb/make.js#L10-L15)).\r\n\r\n## Что дальше\r\nКак видите, часть пунктов из прошлого [плана дальнейших действий](https://ru.bem.info/forum/1007#Дальнейшие-планы) выполнено. Но не все. По-прежнему планирую разобраться с отладкой серверных шаблонов и померять производительность. Также хочется написать хелперы для контроллеров, чтобы не писать каждый раз `new BemhtmlResult(...)`.\r\n\r\nВы же посмотрите [демо-](http://bemtest.ecm7.ru/)[странички](http://bemtest.ecm7.ru/Default/Test) и поиграйтесь с БЭМ на примере какого-нибудь небольшого проекта. Буду рад, если эта моя штука кому-то будет полезна и с удовольствием отвечу на любые вопросы."},"comment":{"url":"https://api.github.com/repos/bem/bem-forum-content-ru/issues/comments/227585152","html_url":"https://github.com/bem/bem-forum-content-ru/issues/1048#issuecomment-227585152","issue_url":"https://api.github.com/repos/bem/bem-forum-content-ru/issues/1048","id":227585152,"user":{"login":"veged","id":15365,"avatar_url":"https://avatars.githubusercontent.com/u/15365?v=3","gravatar_id":"","url":"https://api.github.com/users/veged","html_url":"https://github.com/veged","followers_url":"https://api.github.com/users/veged/followers","following_url":"https://api.github.com/users/veged/following{/other_user}","gists_url":"https://api.github.com/users/veged/gists{/gist_id}","starred_url":"https://api.github.com/users/veged/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/veged/subscriptions","organizations_url":"https://api.github.com/users/veged/orgs","repos_url":"https://api.github.com/users/veged/repos","events_url":"https://api.github.com/users/veged/events{/privacy}","received_events_url":"https://api.github.com/users/veged/received_events","type":"User","site_admin":false},"created_at":"2016-06-21T21:58:18Z","updated_at":"2016-06-21T21:58:18Z","body":"огонь!"}}
{"actor":{"display_login":"veged"}}