web-dev-qa-db-fra.com

Si MVC est une "séparation des préoccupations", alors pourquoi la syntaxe Razor a-t-elle été introduite?

Ma question est liée au modèle de conception MVC et à la syntaxe Razor introduits par Microsoft.

Tout en apprenant le modèle de conception MVC, on m'a dit que l'idée est basée sur un principe connu sous le nom de séparation des préoccupations.

Mais Razor Syntax nous permet d'utiliser directement C # dans Vues.

N'est-ce pas l'intersection des préoccupations?

23
John Strowsky

Vous confondez la syntaxe Razor avec la séparation des préoccupations.

La séparation des préoccupations concerne la façon dont vous structurez votre code.

Pouvoir utiliser C # dans les vues n'empêche pas cela. Cela a rien à voir avec la séparation des préoccupations en tant que telles.

Bien sûr, vous pouvez structurer le code à votre avis pour ne pas respecter la séparation des préoccupations, mais qu'en est-il du code C # utilisé uniquement à des fins d'affichage? Où cela vivrait-il?

66
Oded

Plutôt que de répondre directement à la question, ma réponse remet en question l'hypothèse formulée dans la question. Autrement dit, l'hypothèse selon laquelle Razor a été créé pour MVC est incorrecte. Je travaille chez Microsoft dans l'équipe ASP.NET et j'ai une connaissance de première main de cela.

Razor n'a pas commencé comme moteur de vue pour MVC. Il a été créé pour ASP.NET Web Pages , ce qui est probablement le plus loin possible du côté des préoccupations les moins séparées du spectre. Il a été créé comme une alternative moderne aux formulaires Web ASP.NET/Classic ASP et bien sûr de nombreux autres cadres de programmation de serveur similaires. L'idée de Razor était de créer des transitions presque transparentes entre HTML (balisage) et C # (code).

Ce n'est que plus tard que l'équipe (qui comprend moi-même) a décidé que la syntaxe Razor aurait beaucoup de sens pour le bien d'un moteur de vue pour MVC, qui était écrit par la même équipe.

Quant à savoir si Razor permet, entrave, améliore ou modifie le concept de séparation des préoccupations dans ASP.NET MVC, Oded's answer est parfait.

35
Eilon

Vous confondez "séparation des technologies" et "séparation des préoccupations". L'idée de base derrière la partie "Vue" de MVC est que le code dans la "Vue" n'effectue aucun accès aux données ou logique lourde directement, plutôt qu'il est laissé aux parties "Modèle" et "Contrôleur" respectivement. Le "contrôleur" transforme les données, exécute toute logique nécessaire et les achemine vers la "vue" correcte. La vue peut également effectuer des transformations de données, mais j'ai tendance à les garder purement cosmétiques, comme la transformation de date mentionnée ci-dessus.

9
whoisthemachine

Je peux penser à un parfait Don't do it exemple.

Disons que nous avons un ProductController:

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

Avec le rasoir, nous avons une alternative

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

et à notre avis:

@model IEnumerable<Product> 

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

Je pense qu'il est assez évident que la deuxième solution se sent tellement mal. Si vous faites quelque chose comme ça, ne blâmez pas le rasoir - blâmez-vous.

Et n'oubliez pas: pouvoir utiliser C # dans les vues n'est pas une fonctionnalité de rasoir, c'était également possible avec les vues ASP.NET. Avec le rasoir, c'est juste un peu plus simple.

Si vous recherchez un moteur de modèle plus Rails comme vous devriez jeter un œil à nancy.fx avec le moteur de vue Super simple.

0
Jürgen Steinblock