web-dev-qa-db-ja.com

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

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

MVCデザインパターンを学習しているときに、そのアイデアは懸念の分離として知られる原則に基づいていると言われました。

しかし、Razor Syntaxを使用すると、C#をViewsで直接使用できます。

この懸念の交点ではありませんか?

23
John Strowsky

Razor構文を問題の分離と融合させます。

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

ビューでC#を使用できることはそれを妨げません。 nothingには、懸念の分離自体と関係があります。

確かに、懸念の分離に準拠しないようにビューのコードを構造化できますが、表示目的でのみ使用されるC#コードはどうでしょうか。どこに住んでるの?

66
Oded

私の回答は、質問に直接答えるのではなく、質問で行われた仮定に質問します。つまり、RazorがMVC用に構築されたという仮定は正しくありません。私はASP.NETチームのマイクロソフトで働いており、これについて直接知識があります。

RazorはMVCのビューエンジンとして開始されませんでした。それは ASP.NET Webページ のために作成されたものであり、おそらくスペクトルの最も分離されていない問題に向かって進むことができる範囲です。 ASP.NET Webフォーム/クラシックASPおよびもちろん他の多くの同様のサーバープログラミングフレームワークの現代的な代替手段として作成されました。Razorのアイデアは、HTML(マークアップ)間のほぼシームレスな遷移を作成することでした。およびC#(コード)。

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

RazorがASP.NET MVCでの懸念の分離の概念を有効化、妨害、改善、または変更するかどうかに関しては、 Odedの答え が適切です。

35
Eilon

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

9
whoisthemachine

完璧だと思います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ビューでも可能でした。かみそりを使用すると、少しだけ簡単になります。

より多くのテンプレートエンジンを検索している場合Railsのように、超シンプルビューエンジンでnancy.fxを確認する必要があります。

0