MVCが「懸念の分離」である場合、なぜRazor Syntaxが導入されたのですか?


22

私の質問は、Microsoftによって導入されたMVCデザインパターンとRazor Syntaxに関連しています。

MVCの設計パターンを学習している間、私はこの考えは「懸念の分離」として知られる原則に基づいていると言われました。

ただし、Razor構文を使用すると、ビューで C#を直接使用できます。

これは懸念事項の交差点ではありませんか?


7
ASP.NET MVCが実際にMVCデザインパターンを実装していないことは言及する価値があります。MVCは、モデルが変更のビューによって観察されることを指示しますが、これは明らかにASP.NET MVCには当てはまりません。
ベンジャミングリュンバウム14

11
ビューについての考え方を変えた場合にも役立つかもしれません。ビュークライアント側のコードではありません。これらは、処理時にクライアント側のHTMLを生成するサーバー側のテンプレートです。また、サーバー側のコードとして、そこにC#コードが存在することは完全に受け入れられます。
エリックキング14

6
@R 残念ながら、それはすべてのコミュニティが独自に学習しなければならない教訓のようです。
ホッブズ14

12
@hobbsうわー、わかりました。私の経験ではありません。もちろん、常にそうとは限りませんし、(もちろん)プログラマー側には専門的な責任が必要です。ツールを非難しません。
エリックキング14

7
@BenjaminGruenbaum最近のすべての「MVC」フレームワークとは、相互依存関係の管理方法が異なるのではありませんか?The One And Only True MVC-Styleについて話すのはもはや生産的ではありませんが、ModelsViewsControllersの責任を合理的に分割するシステムの用語を使用する方が実用的ですが、これらは相互依存していますか?
アレックス14

回答:


66

Razor構文を懸念の分離と混同しています。

懸念の分離は、コードの構造に関係しています。

ビューでC#を使用できるようにしても、それを防ぐことはできません。それ自体が懸念の分離とは関係ありません

もちろん、関心の分離に準拠しないようにビュー内のコードを構成できますが、表示目的のみに使用されるC#コードについてはどうでしょうか。それはどこに住んでいますか?


1
しかし、C#はサーバー側の言語ですか?
ジョンストロウスキー14

6
@ジョン-そう?表示用に日付をフォーマットする必要がある場合(および表示は常にクライアント側を意味します)、どこでフォーマットしますか?モデル?コントローラー?どちらでもない。これはビューで行います。
オデッド

16
@John-したがって、日付はDBに保存され、モデル/コントローラーを介してビューに渡します。HTMLで必要なので、C#で直接フォーマットするのではなく、何らかの方法でJSに出力してフォーマットしますか?どうして?なぜそれが良いのですか?それどころか、そのアプローチはどのように懸念を分離するのですか?
Oded 14

25
@ NPSF3000-言語は「サーバー側」でも「クライアント側」でもありません。これはアーキテクチャの分離であり、おそらく言語実装の1つです(JavaScriptはサーバー側またはクライアント側の言語です-node.jsを思い出してください)。
オデッド

14
@FreeAsInBeer-これはクライアント側に属する一種のロジックです-フランスの誰かが日付(および通貨/数字)を米国の誰かとは異なる形式で表示したいと思うでしょう。クライアントは、これらの表示方法を最もよく「知っている」でしょう。これはプレゼンテーションロジックであり、ビューに属します。
オデッド

35

私の回答では、質問に直接答えるのではなく、質問で行われた仮定に疑問を投げかけています。つまり、MVC用にRazorが構築されたという仮定は間違っています。私はMicrosoftでASP.NETチームで働いており、これについて直接的な知識を持っています。

Razorは、MVCのビューエンジンとして開始しませんでした。ASP.NET Web Pages用に作成されました。これは、おそらくスペクトルの最も分離された懸念の側面に向かうことができる限りです。ASP.NET Web Forms / Classic ASP、およびもちろん他の多くの同様のサーバープログラミングフレームワークの最新の代替として作成されました。Razorのアイデアは、HTML(マークアップ)とC#(コード)の間のほぼシームレスな遷移を作成することでした。

後になって、チーム(私も含む)は、同じチームによって作成されたMVCのビューエンジンのために、Razor構文が非常に理にかなっていると判断しました。

RazorがASP.NET MVCの懸念事項の分離の概念を有効化、妨害、改善、または変更するかどうかについては、Odedの答え注目されています。


2
ええ、コメントなしで下票します。元の質問で行われた仮定に疑問を呈していることを明確にするために、回答を修正しました。私が見るように、質問には無効な前提があるため、直接答えることはできません。
エイロン14

好奇心から、他のテンプレートエンジンはASP MVCに考慮されましたか?
NWard

2
@NWard当時、ASP.NET MVCには多くのサードパーティビューエンジンがありましたが、それらをあまり強く考えていませんでした。Razorの方が理解しやすく(HTMLはHTML、C#はC#)、ASP.NET Webページプロジェクトのほうがよく理解できると感じました。
エイロン14

1
@アレックスああ私は確かにすべてのカミソリの信用を取ることはできませんが、私はあなたのコメントに感謝します!
エイロン14

1
@ateriしばらくして、回答の左上にある大きな数字です。
マークハード14

9

「技術の分離」と「懸念の分離」を混同しています。MVCの「ビュー」部分の背後にある基本的な考え方は、「ビュー」内のコードがデータアクセスや重いロジックを直接実行せず、それぞれ「モデル」部分と「コントローラー」部分に残されるということです。「コントローラー」はデータを変換し、必要なロジックを実行して、正しい「ビュー」にルーティングします。ビューはデータ変換も行うことができますが、上記の日付変換など、純粋に見た目を保つ傾向があります。


これは作られたポイントを超える大幅な提供の何にも思われると、前の回答では特に説明しませんこの1
ブヨ

4
+1簡潔で明確な方法で、以前の回答とは異なる説明に焦点を合わせて策定しました。
アレックス14

@gnat私はちょうど彼の混乱がどこにあるのかを明確にしてから、懸念の分離の原則がMVC設計パターンにどのように適用されるかを簡単に説明したかったのです。「懸念の分離」の意味にもっと時間を費やすべきだったのでしょうか?
whoisthemachine 14

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)) {
    ....
}

2番目の解決策が非常に間違っていると感じるのは明らかだと思います。あなたがこのようなことをするなら、かみそりを非難しないでください-自分を非難してください。

また、C#をビューで使用できるようにすることは、かみそりの機能ではなく、ASP.NETビューでも可能だったことを忘れないでください。かみそりを使えば、もう少し簡単です。

レールのようなテンプレートエンジンを検索する場合は、スーパーシンプルビューエンジンでnancy.fxを確認する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.