Якщо MVC - це «Розділення турбот», то чому було введено синтаксис Razor?


22

Моє запитання стосується схеми дизайну MVC та синтаксису Razor, представленого Microsoft.

Під час вивчення схеми дизайну MVC мені сказали, що ідея базується на принципі, відомому як розділення проблем .

Але синтаксис Razor дозволяє нам безпосередньо використовувати C # in Views .

Чи не це перетин проблем?


7
Варто зазначити, що ASP.NET MVC насправді не реалізує модель дизайну MVC. MVC диктує, що модель спостерігається за поглядом на зміни, що, очевидно, не так у ASP.NET MVC.
Бенджамін Груенбаум

11
Можливо, це також допоможе, якщо ви змінили, як ви думаєте про «Перегляди». Перегляди не є кодовим кодом. Це шаблони на стороні сервера, які при обробці генерують HTML на стороні клієнта. А як код на стороні сервера, цілком прийнятно, що там є код C #.
Ерік Кінг

6
@EricKing, за винятком тієї частини, де системи шаблонів, які дозволяють довільний код, завжди ведуть через шлях найменшого опору до поганого дизайну, жахливого порушення шару та незмінності. На жаль, схоже, це урок, який кожна громада має засвоїти самостійно.
панно

12
@hobbs Нічого, добре. Не в моєму досвіді. Звичайно, не завжди, і, звичайно, є певна професійна відповідальність програміста. Я не звинувачую цей інструмент.
Ерік Кінг

7
@BenjaminGruenbaum Хіба не кожен "MVC" -рамник сьогодні відрізняється тим, як вони управляють взаємозалежностями? До того часу, коли говорити про єдиний і єдино вірний MVC-стиль вже не продуктивно, але де було б більш прагматичним використовувати цей термін для будь-якої системи, яка розумно розподіляє відповідальність у моделях , переглядах та контролерах, однак вони взаємозалежні?
Олексій

Відповіді:


66

Ви пов’язуєте синтаксис бритви з відокремленням проблем.

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

Можливість використання C # у видах цього не заважає. Це не має нічого спільного з відокремленням проблем як таких.

Звичайно, ви можете структурувати код на ваш погляд, щоб він не відповідав роз'єднанню проблем, а як щодо коду C #, який використовується лише для відображення? Де б це жило?


1
Але C # - мова на сервері?
Джон Стровський

6
@John - так? Якщо вам потрібно форматувати дати для відображення (а відображення завжди означає клієнтську сторону), де б ви їх відформатували? Модель? Контролер? Ні. Ви зробили б це на виду.
Oded

16
@John - отже, ваша дата зберігається в БД, ви передаєте її через модель / контролер на ваш погляд. Вам потрібен там HTML, щоб ви вивели його якось у формат JS, а не безпосередньо форматували на C #? Чому? Чому це краще? А точніше, як такий підхід більше розділяє питання?
Oded

25
@ NPSF3000 - мова не є "стороною сервера" або "стороною клієнта". Це архітектурний поділ - і, можливо, одна з мовних реалізацій (це JavaScript на стороні сервера або на стороні клієнта - пам’ятайте node.js).
Одід

14
@FreeAsInBeer - така логіка, що належить клієнтові, - хтось у Франції хотів би побачити дати (та валюту / цифри), відформатовані по-різному для когось у США. Клієнт найкраще «знає», як вони повинні відображатися. Це логіка викладу , і як така належить до перегляду.
Oded

35

Замість того, щоб безпосередньо відповісти на запитання, моя відповідь ставить під сумнів припущення, зроблене в питанні. Тобто припущення про те, що Razor був побудований для MVC, є невірним. Я працюю в Microsoft над командою ASP.NET і знаю про це з перших рук.

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

Лише пізніше команда (до якої я ввійшов) вирішила, що синтаксис Razor матиме багато сенсу заради механізму перегляду MVC, який написав той самий колектив.

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


2
Так, без коментарів. Я змінив свою відповідь, щоб зрозуміти, що я ставлю під сумнів припущення, зроблене в первісному запитанні. Як я бачу, питання не відповідає безпосередньо, оскільки воно має недійсну передумову.
Ейлон

З цікавості, чи розглядалися інші двигуни-шаблони для ASP MVC?
NWard

2
@NWard У той час для ASP.NET MVC було декілька сторонніх двигунів, але ми не вважали їх занадто сильно. Ми вважали, що Razor було легше зрозуміти (HTML - це HTML, C # - C #), а також краще створити проект ASP.NET Web Pages.
Ейлон

1
@ Алекс о, я, звичайно, не можу взяти на себе кредит за весь Razor, але я ціную ваш коментар!
Ейлон

1
@ateri Через короткий час це велика кількість у верхньому лівому куті відповіді.
Марк Херд

9

Ви плутаєте "розділення технологій" з "розділенням проблем". Основна ідея, що стоїть у розділі MVC "Перегляд", полягає в тому, що код у "Перегляді" не виконує жодного доступу до даних або важкої логіки безпосередньо, скоріше, щоб залишити відповідно "Модель" та "Контролер". "Контролер" перетворює дані, виконує будь-яку необхідну логіку та спрямовує їх до правильного "Перегляду". Перегляд також може робити перетворення даних, але я схильний тримати їх виключно косметично, як-от перетворення дати, згадане вище.


це, здається, не пропонує нічого суттєвого щодо питань, викладених та пояснених у попередніх відповідях, особливо цього
грунт

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 за допомогою двигуна Super simple view.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.