Если MVC - это разделение интересов, то почему был введен синтаксис Razor?

22

Мой вопрос связан с шаблоном проектирования MVC и синтаксисом Razor, представленным Microsoft.

При изучении шаблона проектирования MVC мне сказали, что идея основана на принципе, известном как разделение проблем .

Но Razor Syntax позволяет нам использовать C # в Views напрямую.

Разве это не пересечение проблем?

Джон Стровски
источник
7
Стоит отметить, что ASP.NET MVC на самом деле не реализует шаблон проектирования MVC. MVC требует, чтобы модель наблюдалась с точки зрения изменений, чего явно нет в ASP.NET MVC.
Бенджамин Грюнбаум
11
Это также может помочь, если вы изменили свой взгляд на представления. Представления не являются клиентским кодом. Это шаблоны на стороне сервера, которые при обработке генерируют html на стороне клиента. И как код на стороне сервера, вполне приемлемо, что там есть код C #.
Эрик Кинг,
6
@EricKing, за исключением той части, где системы шаблонов, которые допускают произвольный код, всегда ведут, по пути наименьшего сопротивления, к плохому дизайну, ужасному нарушению наслоения и невозможности обслуживания. К сожалению, похоже, что урок, который каждое сообщество должно усвоить самостоятельно.
Хоббс
12
@ hobbs Ух ты, хорошо. Не в моем опыте. Конечно, не всегда, и (конечно) от программиста требуется определенная профессиональная ответственность. Я не виню инструмент.
Эрик Кинг,
7
@BenjaminGruenbaum Разве не все "MVC" -рамы в наши дни отличаются друг от друга тем, как они управляют взаимозависимостями? До такой степени, что говорить о едином и единственном истинном стиле MVC уже не продуктивно, но где было бы более прагматично использовать термин для любой системы, которая разумно разделяет ответственность в Моделях , Представлениях и Контроллерах, однако они взаимозависимы?
Алекс

Ответы:

66

Вы смешиваете синтаксис Razor с разделением интересов.

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

Возможность использования C # в представлениях не мешает этому. Это не имеет ничего общего с разделением интересов как таковым.

Конечно, вы можете структурировать код в своем представлении так, чтобы он не соответствовал разделению интересов, но как насчет кода C #, который используется только для целей отображения? Где это будет жить?

Одед
источник
1
Но C # - это серверный язык?
Джон Стровски
6
@ Джон - так? Если вам нужно отформатировать даты для отображения (а отображение означает на стороне клиента, всегда), где бы вы отформатировали их? Модель? Контроллер? Ни. Вы бы сделали это в представлении.
Одед
16
@ Джон - итак, ваша дата хранится в БД, вы передаете ее через модель / контроллер для просмотра. Вы нуждаетесь там в HTML, так что вы бы вывели его как-то в JS для форматирования, а не напрямую в C #? Зачем? Почему это лучше? Или, скорее, как этот подход больше разделения интересов?
Одед
25
@ NPSF3000 - язык не "серверная" или "клиентская". Это архитектурное разделение - и, возможно, одна из языковых реализаций (это JavaScript на стороне сервера или на стороне клиента - вспомните node.js).
Одед
14
@FreeAsInBeer - это та логика, которая принадлежит клиентской стороне - кто-то во Франции хотел бы видеть даты (и валюту / цифры) отформатированными по-другому, чем в США. Клиент лучше всего «знает», как они должны отображаться. Это логика представления , и как таковая принадлежит в представлении.
Одед
35

Вместо того, чтобы прямо отвечать на вопрос, мой ответ ставит под сомнение допущение, сделанное в вопросе. То есть предположение, что Razor был создан для MVC, неверно. Я работаю в Microsoft в команде ASP.NET и знаю из первых рук об этом.

Бритва не начиналась как двигатель представления для MVC. Он был создан для веб-страниц ASP.NET , которые, вероятно, настолько далеко, насколько вы можете пойти в сторону спектра наименее разделенных интересов. Он был создан как современная альтернатива ASP.NET Web Forms / Classic ASP и, конечно, многим другим аналогичным средам программирования сервера. Идея Razor заключалась в создании практически бесшовных переходов между HTML (разметка) и C # (код).

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

Относительно того, разрешает ли Razor, мешает, улучшает или изменяет концепцию разделения интересов в ASP.NET MVC, ответ Одеда очевиден .

Eilon
источник
2
Yay, downvote без комментариев. Я изменил свой ответ, чтобы было ясно, что я подвергаю сомнению допущение, сделанное в первоначальном вопросе. На мой взгляд, вопрос не подлежит прямой ответственности, поскольку имеет неверную предпосылку.
Эйлон
Из любопытства, были ли рассмотрены какие-либо другие движки шаблонов для ASP MVC?
NWard
2
@NWard В то время было несколько сторонних движков для ASP.NET MVC, но мы не рассматривали их слишком сильно. Мы чувствовали, что Razor легче понять (HTML - это HTML, C # - это C #), а также лучше работать с проектом ASP.NET Web Pages.
Эйлон
1
@ Алекс, о, конечно, я не могу взять кредит на все Razor, но я ценю ваш комментарий!
Эйлон
1
@ateri Через некоторое время это большое число в верхнем левом углу ответа.
Марк Херд
9

Вы путаете «разделение технологий» с «разделением интересов». Основная идея, стоящая за частью «View» MVC, заключается в том, что код в «View» не выполняет непосредственный доступ к данным или тяжелую логику, а скорее остается за частями «Model» и «Controller» соответственно. «Контроллер» преобразует данные, выполняет любую необходимую логику и направляет их в правильный «Вид». Представление также может выполнять преобразования данных, но я склонен сохранять их чисто косметическими, такими как преобразование даты, упомянутое выше.

whoisthemachine
источник
это, кажется, не предлагает ничего существенного по сравнению с замечаниями, сделанными и объясненными в предыдущих ответах, особенно в этом
комнат
4
+1 Сформулировано в краткой и понятной форме и с другой направленностью объяснения, чем предыдущие ответы.
Алекс
@gnat Я просто хотел прояснить, в чем заключается его замешательство, а затем быстро объяснить, как принцип разделения интересов применим к шаблону проектирования MVC. Возможно, я должен был потратить больше времени на то, что означает «разделение интересов»?
whoisthemachine
0

Я могу придумать идеальный Don't do itпример.

Допустим, у нас есть ProductController:

public class ProductController()
{
    public ViewResult Discontinued()
    {
        var db = new ProductsDb();
        var products = db.Products.Where(x => x.Discontinued).ToList();
        return new ViewResult(products);
    }
}

С бритвой у нас есть альтернатива

public class ProductController()
{
    public ViewResult Discontinued()
    {
        var db = new ProductsDb();
        var products = db.Products.ToList();
        return new ViewResult(products);
    }
}

и по нашему мнению:

@model IEnumerable<Product> 

@foreach (var item in Model.Where(x => x.Discontinued)) {
    ....
}

Я думаю, что совершенно очевидно, что второе решение кажется таким неправильным. Если вы делаете что-то подобное, не вините бритву - вините себя.

И не забывайте: возможность использовать C # в представлениях - это не особенность бритвы, это было возможно и в представлениях ASP.NET. С бритвой все немного проще.

Если вы ищете шаблонизатор, который больше похож на движок, вам следует взглянуть на nancy.fx с супер простым механизмом просмотра.

Юрген Стейнблок
источник