MVC4 и razor helpers
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.09.12 12:04
Оценка: 10 (3) +1
В MVC3 была такая фича — можно было положить в App_Code razor файлик и наобъявлять в нем хелперов, а потом эти хелперы использовать в любой вьюхе. При помощи этого можно было реализовать некое подобие "контролов".
В MVC4 эта фича внезапно исчезла без объявления войны. В официальном breaking changes, что характерно, об этом ни слова.
Вопрос — что взамен? Руками писать статические методы как то совсем тоскливо. RazorGenerator не поддерживает новые синтаксические фишки, да и вообще не хочется тянуть лишние тулзы, от которых так просто не избавится потом.
... << RSDN@Home 1.2.0 alpha 5 rev. 65 on Windows 7 6.1.7601.65536>>
AVK Blog
Re: MVC4 и razor helpers
От: Аноним  
Дата: 07.09.12 12:14
Оценка:
http://forums.asp.net/t/1799665.aspx/1

Там есть ответ Andrew Nurse

Здравствуйте, AndrewVK, Вы писали:

AVK>В MVC3 была такая фича — можно было положить в App_Code razor файлик и наобъявлять в нем хелперов, а потом эти хелперы использовать в любой вьюхе. При помощи этого можно было реализовать некое подобие "контролов".

AVK>В MVC4 эта фича внезапно исчезла без объявления войны. В официальном breaking changes, что характерно, об этом ни слова.
AVK>Вопрос — что взамен? Руками писать статические методы как то совсем тоскливо. RazorGenerator не поддерживает новые синтаксические фишки, да и вообще не хочется тянуть лишние тулзы, от которых так просто не избавится потом.
Re[2]: MVC4 и razor helpers
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.09.12 12:21
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>http://forums.asp.net/t/1799665.aspx/1


А>Там есть ответ Andrew Nurse


Ну то есть таки RazorGenerator. Мдя.
... << RSDN@Home 1.2.0 alpha 5 rev. 65 on Windows 7 6.1.7601.65536>>
AVK Blog
Re: MVC4 и razor helpers
От: hVostt Россия http://hvostt.ru
Дата: 07.09.12 17:18
Оценка: -1
Здравствуйте, AndrewVK, Вы писали:

AVK>В MVC3 была такая фича — можно было положить в App_Code razor файлик и наобъявлять в нем хелперов, а потом эти хелперы использовать в любой вьюхе. При помощи этого можно было реализовать некое подобие "контролов".

AVK>В MVC4 эта фича внезапно исчезла без объявления войны. В официальном breaking changes, что характерно, об этом ни слова.
AVK>Вопрос — что взамен? Руками писать статические методы как то совсем тоскливо. RazorGenerator не поддерживает новые синтаксические фишки, да и вообще не хочется тянуть лишние тулзы, от которых так просто не избавится потом.

Честно говоря, хорошо, что убрали эту фичу, позволяющую плодить не эффективный и плохо сопровождаемый код.
Делать свои контролы можно в PartialView, Editors/Display шаблонах и в @Html.Хелперах. Тогда все будет расставлено по своим местам.

Но если очень хочется, то да. RazorGenerator, но я бы побрезговал им пользоваться, кроме как для генерации почтовых писем.
специализация — удел насекомых... (с) Р. Хайнлайн
Re[2]: MVC4 и razor helpers
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.09.12 17:39
Оценка: 1 (1) +2
Здравствуйте, hVostt, Вы писали:

V>Честно говоря, хорошо, что убрали эту фичу, позволяющую плодить не эффективный и плохо сопровождаемый код.


Это с чего он неэффективный и плохо сопровождаемый? Точно такой же хелпер, как и внутри вьюх, просто в отдельном файле.

V>Делать свои контролы можно в PartialView


А параметры передавать через динамики неявно? Кто там говорил про неэффективный и плохо сопровождаемый код?

V>, Editors/Display шаблонах и в @Html.Хелперах.


Да да, генерировать html на голом шарпе, это, конечно, намного эффективнее и сопровождаемее, чем razor файл. Может того, вообще разором не пользоваться? Берешь голый шарп и вперед, на мины.
... << RSDN@Home 1.2.0 alpha 5 rev. 65 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[3]: MVC4 и razor helpers
От: hVostt Россия http://hvostt.ru
Дата: 09.09.12 14:49
Оценка:
Здравствуйте, AndrewVK, Вы писали:


V>>Честно говоря, хорошо, что убрали эту фичу, позволяющую плодить не эффективный и плохо сопровождаемый код.

AVK>Это с чего он неэффективный и плохо сопровождаемый? Точно такой же хелпер, как и внутри вьюх, просто в отдельном файле.

Во-первых, файлик с хелперами, где навалено в кучу все подряд.
Во-вторых, код в App_Code не компилируется, а интерпретируется. Хорошо для легковесных сайтов, для серьезных проектов, где нужно управлять данными, кешированием и т.п. плохо.

V>>Делать свои контролы можно в PartialView

AVK>А параметры передавать через динамики неявно? Кто там говорил про неэффективный и плохо сопровождаемый код?

Чем плохо? У меня есть партиалы Footer, TopMenu, Basket, Comments, и т.п. Лучше партиалов в MVC3/4 пока ничего не придумали для этого.

Универсальные контролы, часть на Editor/Display шаблонах (по входящим типам, типа string, DateTime, int... свои POCO-объекты)
Сложные контролы типа Гридов всяких проще реализовать средствами C#, чем Razor сравните два кода:

Таблица хелпером на C#

 @(Html.Grid(Model.Items)
    .Column(x => x.Caption("Название").Content(m => (++counter)))
    .Column(x => x.Caption("Название").Content(m => Html.ActionLink(m.Value.Article, "Index", "Item", new { id = m.Key }, null)))
    .Column(x => x.Caption("Цена").Content(m => m.Price.ToString("C")))
    .Column(x => x.Caption("Кол-во").Content(m => m.Amount))
    .Column(x => x.Caption("Сумма").Content(m => (m.Price * m.Amount).ToString("C")))
)


Ну и Razor-синтаксис:

<table>
            <thead>
               <tr>
                  <th>№</th>
                  <th>Название</th>
                  <th>Цена</th>
                  <th>Кол-во</th>
                  <th>Сумма</th>
               </tr>
            </thead>
            @foreach (var item in Model.Items)
            {               
               <tr> 
                  <td>@(++counter)</td>
                  <td>
                     @Html.ActionLink(item.Article, "Index", "Item", new { id = item.Key }, null)
                  </td>
                  <td>@item.Price.ToString("C")</td>
                  <t>@item.Amount</td>
                  <td>@((item.Price * item.Amount).ToString("C"))</td>                 
               </tr>
            }            
</table>


Самый первый недостаток Razor-генерации: поддержка одинакового количества колонок в заголовке и в данных. Пока логика простая и колонок мало, еще нормально, но с увеличением при активной разработке, одни сплошные маты. При генерации своим C# хелпером, это контроллируется на уровне кода и никаких накладок.

ДОжили блин, уже не можем генерировать HTML на C#

V>>, Editors/Display шаблонах и в @Html.Хелперах.


AVK>Да да, генерировать html на голом шарпе, это, конечно, намного эффективнее и сопровождаемее, чем razor файл. Может того, вообще разором не пользоваться? Берешь голый шарп и вперед, на мины.


Надо использовать инструменты разумно. А не брать молоток и использовать его как лом, и как отвертку и вообще везде где придется.
специализация — удел насекомых... (с) Р. Хайнлайн
Re[3]: MVC4 и razor helpers
От: hVostt Россия http://hvostt.ru
Дата: 09.09.12 15:08
Оценка:
Здравствуйте, AndrewVK, Вы писали:

V>>, Editors/Display шаблонах и в @Html.Хелперах.


AVK>Да да, генерировать html на голом шарпе, это, конечно, намного эффективнее и сопровождаемее, чем razor файл. Может того, вообще разором не пользоваться? Берешь голый шарп и вперед, на мины.


Ах да, это не только эффективней, это ещё и проще! Да-да.

Зацените, как можно отрендерить таблицу:

    public class Grid<T> : IHtmlString
...
        public string ToHtmlString()
        {
            var table = new Tag("table")
                .Inner(new[] { new Tag("thead")
                    .Inner(new Tag("tr")
                        .Inner(_columns.Select(x => new Tag("th")
                                .Text(x.Caption)
                                .Class(x.CaptionClass)))) }
                    .Concat(_model
                        .Select(row => new Tag("tr")
                            .Inner(_columns.Select(column => new Tag("td")
                                .Inner(column.Content(row))
                                .Class(column.Class)))))
                );

            return table.ToHtmlString();
        }
...


Не самая лучшая моя реализация, и писанная буквально на коленке. Если немного покорпеть, то можно вообще сделать «сахарную бомбу»
специализация — удел насекомых... (с) Р. Хайнлайн
Re[4]: MVC4 и razor helpers
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.09.12 18:31
Оценка: 1 (1)
Здравствуйте, hVostt, Вы писали:

V>Во-первых, файлик с хелперами, где навалено в кучу все подряд.


Если в файле с хелперами навалено все подряд, это, прости, не хелперы виноваты, а навальщик.

V>Во-вторых, код в App_Code не компилируется, а интерпретируется.


Смешно. Где можно посмотреть на интерпретатор C# в фреймворке? Ты с компиляцией on demand не спутал, случаем? Так она никуда и в MVC4 не делась — вьюхи по прежнему ее поддерживают.

AVK>>А параметры передавать через динамики неявно? Кто там говорил про неэффективный и плохо сопровождаемый код?

V>Чем плохо?

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

V> У меня есть партиалы Footer, TopMenu, Basket, Comments, и т.п.


А какой нибудь контрол для пейджинга — это у тебя тоже partial view? Partial view созданы для вполне конкретной цели — создание сравнительно независимых блоков в составе страницы. Скажем, виджет погоды какой — самое то. Глобальное меню и футер всяко лучше вытащить в лейаут, потому что не надо потом в каждой странице протаптывать рендер для каждого блока. А вот нечто, что можно назвать "контролами" — оно на partial view ложится фигово, потому что это обычно не готовый независимый блок, а некая заготовка, требующая энного количества обязательных параметров. И именно поэтому есть хелпер Html, который содержит совсем уж базовые вещи. И именно для этого же нужны и хелперы. Только написание более менее крупных хелперов, больше одного тега, на голом шарпе — довольно печальное занятие.

V>Универсальные контролы, часть на Editor/Display шаблонах (по входящим типам, типа string, DateTime, int... свои POCO-объекты)


Эти шаблоны работают только если ты используешь биндинг и контролы отображают непосредственно забинденные данные.

V>Таблица хелпером на C#


V>
V> @(Html.Grid(Model.Items)
V>    .Column(x => x.Caption("Название").Content(m => (++counter)))
V>    .Column(x => x.Caption("Название").Content(m => Html.ActionLink(m.Value.Article, "Index", "Item", new { id = m.Key }, null)))
V>    .Column(x => x.Caption("Цена").Content(m => m.Price.ToString("C")))
V>    .Column(x => x.Caption("Кол-во").Content(m => m.Amount))
V>    .Column(x => x.Caption("Сумма").Content(m => (m.Price * m.Amount).ToString("C")))
V>)
V>


Ты забыл привести исходники .Column, .Content и т.д. Разор то тоже умеет общий код в другие хелперы выносить.

V>Самый первый недостаток Razor-генерации: поддержка одинакового количества колонок в заголовке и в данных.




V>ДОжили блин, уже не можем генерировать HTML на C#


Ну то есть ты от разора предлагаешь совсем отказаться? Спасибо, вопросов больше нет.

V>Надо использовать инструменты разумно.


Я что то пока разумных вещей с твоей стороны не увидел. Спрошлные подтасовки и открованная неправда.

V> А не брать молоток и использовать его как лом, и как отвертку и вообще везде где придется.


И это опять очередное передергивание. Никто здесь не предлагает использовать хелперы везде, где придется.
... << RSDN@Home 1.2.0 alpha 5 rev. 65 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[4]: MVC4 и razor helpers
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.09.12 19:30
Оценка:
Здравствуйте, hVostt, Вы писали:

V>Зацените, как можно отрендерить таблицу:


С примерами, где идеально регулярная и избыточная структура все понятнее. Куда интереснее, когда структура нерегулярна, да еще с намешанным JS.
... << RSDN@Home 1.2.0 alpha 5 rev. 65 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[5]: MVC4 и razor helpers
От: hVostt Россия http://hvostt.ru
Дата: 09.09.12 20:19
Оценка:
Здравствуйте, AndrewVK, Вы писали:

V>>Во-вторых, код в App_Code не компилируется, а интерпретируется.

AVK>Смешно. Где можно посмотреть на интерпретатор C# в фреймворке? Ты с компиляцией on demand не спутал, случаем? Так она никуда и в MVC4 не делась — вьюхи по прежнему ее поддерживают.
Он деманд и есть по сути интерпретация. PHP так-то тоже все компилирует (современный), но это не избавляет его от ярлыка «интерпретатор». Вьюхи кстати можно прям в bin компилировать на стеке это уже много раз обсуждалось. А вот App_Code — нет. Хотя я всего лишь делаю предположения на счет того, как это сказывается на производительности, т.е. могу ошибаться.

AVK>>>А параметры передавать через динамики неявно? Кто там говорил про неэффективный и плохо сопровождаемый код?

V>>Чем плохо?
AVK>Чем плохо передавать параметры неявно и без какого либо контроля со стороны компилятора? Я, пожалуй, на этот вопрос отвечать не буду.
Если уже говорить про контроль со стороны компилятора... Те же контракты — давай до свидания?

V>> У меня есть партиалы Footer, TopMenu, Basket, Comments, и т.п.

AVK>А какой нибудь контрол для пейджинга — это у тебя тоже partial view? Partial view созданы для вполне конкретной цели — создание сравнительно независимых блоков в составе страницы. Скажем, виджет погоды какой — самое то. Глобальное меню и футер всяко лучше вытащить в лейаут, потому что не надо потом в каждой странице протаптывать рендер для каждого блока. А вот нечто, что можно назвать "контролами" — оно на partial view ложится фигово, потому что это обычно не готовый независимый блок, а некая заготовка, требующая энного количества обязательных параметров. И именно поэтому есть хелпер Html, который содержит совсем уж базовые вещи. И именно для этого же нужны и хелперы. Только написание более менее крупных хелперов, больше одного тега, на голом шарпе — довольно печальное занятие.

Вы наверное никогда не ковыряли исходники компонентов для ASP.NET MVC от Telerik, DevExpress, да хоть тот же MVCContrib. Те ребята наверное совсем-совсем дураки, так как с вами в корне не согласны? Посмотрите как у них устроены контролы. Сложнейшие, с кучей js-кода (и даже css, подмешиваемого в bundlers). @Html.Хелперы + Editor/Display шаблоны прекрасно решают свою задачу. А не как вы говорите «совсем уж базовые вещи».

V>>Универсальные контролы, часть на Editor/Display шаблонах (по входящим типам, типа string, DateTime, int... свои POCO-объекты)

AVK>Эти шаблоны работают только если ты используешь биндинг и контролы отображают непосредственно забинденные данные.

Ну типа того. Однако можно и не забинденные данные подсунуть, указав наименование Editor/Display шаблона "строчкой". Хотя это не самый лучший выход.

V>>Таблица хелпером на C#

AVK>Ты забыл привести исходники .Column, .Content и т.д. Разор то тоже умеет общий код в другие хелперы выносить.

Самый обычный fluent-интерфейс. Реализация на столько примитивная, что нет смысла её приводить. По сути собираем данные цепочкой и рендерим их, реализуя IHtmlString интерфейс.

V>>ДОжили блин, уже не можем генерировать HTML на C#

AVK>Ну то есть ты от разора предлагаешь совсем отказаться? Спасибо, вопросов больше нет.
Почему отказаться? Вообще не надо отказываться. Я ратую только за то, что разор решает задачу HTML-разметки. Но сложная логика генерации разметки плохо подходит для разора — кашу кода с условиями и циклами никакой разор не спасёт (на примере обычной таблицы).

V>>Надо использовать инструменты разумно.

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


Кстати, про возможность использовать razor-файлики с хелперами в MVC 3 я не знал. Возможно, если бы знал, то использовал бы их. И был бы целиком на вашей стороне
специализация — удел насекомых... (с) Р. Хайнлайн
Re[5]: MVC4 и razor helpers
От: hVostt Россия http://hvostt.ru
Дата: 09.09.12 20:24
Оценка:
Здравствуйте, AndrewVK, Вы писали:


V>>Зацените, как можно отрендерить таблицу:

AVK>С примерами, где идеально регулярная и избыточная структура все понятнее. Куда интереснее, когда структура нерегулярна, да еще с намешанным JS.

Тем более. Значит много всяких условий, виртуальных структур/делегатов, коллекций, циклов... Всё это на Razor-е: встречал я такие штуки. Даже подсветка синтаксиса и отбивка кода совсем не спасает. Хотя что там, пол литра и вперед!
специализация — удел насекомых... (с) Р. Хайнлайн
Re[6]: MVC4 и razor helpers
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.09.12 20:29
Оценка: 1 (1) +1
Здравствуйте, hVostt, Вы писали:

V>Он деманд и есть по сути интерпретация.


Сильное заявление. Но ты можешь, конечно, рассказать, как компиляция по требованию снижает производительность итогового кода.

V> PHP так-то тоже все компилирует (современный), но это не избавляет его от ярлыка «интерпретатор».


С ярлыками в другой форум.

V>Если уже говорить про контроль со стороны компилятора... Те же контракты — давай до свидания?


Тебе сколько лет?

AVK>>Ты забыл привести исходники .Column, .Content и т.д. Разор то тоже умеет общий код в другие хелперы выносить.


V>Самый обычный fluent-интерфейс


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

AVK>>Ну то есть ты от разора предлагаешь совсем отказаться? Спасибо, вопросов больше нет.

V>Почему отказаться?

Ну, как бы ни один из твоих аргументов никак не выделяет хелперы и в равной степени относится ко всему разору.

V> Вообще не надо отказываться. Я ратую только за то, что разор решает задачу HTML-разметки.


Разоровые хелперы, что характерно, решают ровно ту же задачу.

V> Но сложная логика генерации разметки плохо подходит для разора


А никто и не предлагал пихать в разор сложную логику генерации или кашу кода с условиями и циклами. Это как раз ты предлагаешь запихивать в шарп все подряд, даже если там 95% статическая разметка.

V>Я и не претендую. Просто мой опыт разработки и досконального ковыряния известных фреймворков показывает, что разор далеко не всегда хорош


Ты споришь сам с собой.

V>Кстати, про возможность использовать razor-файлики с хелперами в MVC 3 я не знал.


Ну да, к третьему сообщению оказывается, что ты был не в курсе собственно предмета обсуждения.
... << RSDN@Home 1.2.0 alpha 5 rev. 65 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[6]: MVC4 и razor helpers
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.09.12 20:29
Оценка:
Здравствуйте, hVostt, Вы писали:

AVK>>С примерами, где идеально регулярная и избыточная структура все понятнее. Куда интереснее, когда структура нерегулярна, да еще с намешанным JS.


V>Тем более. Значит много всяких условий, виртуальных структур/делегатов, коллекций, циклов...


Нет, не значит.
... << RSDN@Home 1.2.0 alpha 5 rev. 65 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[7]: MVC4 и razor helpers
От: hVostt Россия http://hvostt.ru
Дата: 10.09.12 08:01
Оценка: -1 :)
Здравствуйте, AndrewVK, Вы писали:

V>>Кстати, про возможность использовать razor-файлики с хелперами в MVC 3 я не знал.

AVK>Ну да, к третьему сообщению оказывается, что ты был не в курсе собственно предмета обсуждения.

У вас ярко выраженное раздувшееся ЧСВ.
Даже если вы 100% правы, а оппонент не прав, не стоит так грубо разговаривать.
специализация — удел насекомых... (с) Р. Хайнлайн
Re: MVC4 и razor helpers
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 19.09.12 15:23
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>В MVC3 была такая фича — можно было положить в App_Code razor файлик и наобъявлять в нем хелперов, а потом эти хелперы использовать в любой вьюхе. При помощи этого можно было реализовать некое подобие "контролов".

AVK>В MVC4 эта фича внезапно исчезла без объявления войны. В официальном breaking changes, что характерно, об этом ни слова.
AVK>Вопрос — что взамен? Руками писать статические методы как то совсем тоскливо. RazorGenerator не поддерживает новые синтаксические фишки, да и вообще не хочется тянуть лишние тулзы, от которых так просто не избавится потом.

Дасадно . Поделитесь как решили проблему, нам тоже светит переход с 3 на 4.
Re[2]: MVC4 и razor helpers
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.09.12 16:17
Оценка:
Здравствуйте, achmed, Вы писали:

A>Дасадно . Поделитесь как решили проблему, нам тоже светит переход с 3 на 4.


Да как, вернулись к RazorGenerator. Отвалилась возможность не писать для констант Url.Content, в остальном вроде пока полет нормальный, IT даже часть вьюх на него перевел ради контроля содержимого при компиляции.
... << RSDN@Home 1.2.0 alpha 5 rev. 65 on Windows 8 6.2.9200.0>>
AVK Blog
Re: MVC4 и razor helpers
От: Svetmura  
Дата: 22.10.12 15:52
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>В MVC3 была такая фича — можно было положить в App_Code razor файлик и наобъявлять в нем хелперов, а потом эти хелперы использовать в любой вьюхе. При помощи этого можно было реализовать некое подобие "контролов".

AVK>В MVC4 эта фича внезапно исчезла без объявления войны. В официальном breaking changes, что характерно, об этом ни слова.
AVK>Вопрос — что взамен? Руками писать статические методы как то совсем тоскливо. RazorGenerator не поддерживает новые синтаксические фишки, да и вообще не хочется тянуть лишние тулзы, от которых так просто не избавится потом.

Пытаюсь освоить MVC, и не получается никак хелпер написать, сам хелпер пишется, но когда я его кладу в дирректорию App_Сode то он почему-то не может выполнять инструкции типа @Html.TextBox, пишет что объект Html — null. Не понимаю как решить эту проблему.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.