Se MVC è "Separazione delle preoccupazioni", allora perché è stata introdotta la sintassi del rasoio?


22

La mia domanda riguarda il modello di progettazione MVC e la sintassi del rasoio introdotta da Microsoft.

Durante l'apprendimento del modello di progettazione MVC mi è stato detto che l'idea si basa su un principio noto come Separazione delle preoccupazioni .

Ma Razor Syntax ci consente di usare direttamente C # in Views .

Questo incrocio di preoccupazioni non è?


7
Vale la pena ricordare che ASP.NET MVC non implementa effettivamente il modello di progettazione MVC. MVC impone che il modello sia osservato dalla vista per le modifiche che non è chiaramente il caso in ASP.NET MVC.
Benjamin Gruenbaum,

11
Potrebbe anche essere utile se hai cambiato il modo di pensare a Views. Le viste non sono codice lato client. Sono modelli lato server che, una volta elaborati, generano html lato client. E come codice lato server, è perfettamente accettabile che ci sia un codice C # lì.
Eric King,

6
@EricKing ad eccezione della parte in cui i sistemi di templating che consentono il codice arbitrario portano sempre, attraverso il percorso di minore resistenza, a cattiva progettazione, orribile violazione della stratificazione e non mantenibilità. Sfortunatamente, sembra essere una lezione che ogni comunità deve imparare da sola.
Hobbs,

12
@hobbs Wow, ok. Non nella mia esperienza. Certamente non sempre, e (ovviamente) c'è una certa responsabilità professionale da parte del programmatore. Non biasimo lo strumento.
Eric King,

7
@BenjaminGruenbaum Non è come ogni quadro "MVC" al giorno d'oggi diverso nel modo in cui gestiscono le interdipendenze? Al punto in cui non è più produttivo parlare di The One And Only True MVC-Style, ma dove sarebbe più pragmatico usare il termine per qualsiasi sistema che suddivide ragionevolmente la responsabilità in Modelli , Viste e Controller, tuttavia questi sono interdipendenti?
Alex,

Risposte:


66

Stai mescolando la sintassi del rasoio con la separazione delle preoccupazioni.

La separazione delle preoccupazioni ha a che fare con la struttura del codice.

Essere in grado di usare C # nelle viste non lo impedisce. Non ha nulla a che fare con la separazione delle preoccupazioni in quanto tale.

Certo, puoi strutturare il codice nella tua vista in modo da non rispettare la separazione delle preoccupazioni, ma che dire del codice C # che viene utilizzato solo a scopo di visualizzazione? Dove sarebbe vivere?


1
Ma C # è il linguaggio lato server?
John Strowsky,

6
@John - così? Se hai bisogno di formattare le date per la visualizzazione (e display significa sempre lato client), dove le formatteresti? Il modello? Il controller? Né. Lo faresti nella vista.
Oded,

16
@John - quindi, la tua data è memorizzata nel DB, la passi attraverso il modello / controller alla tua vista. Ti serve l'HTML, quindi lo faresti in qualche modo su JS per formattarlo, invece di formattarlo direttamente con C #? Perché? Perché è meglio? O meglio, in che modo questo approccio è più una separazione delle preoccupazioni?
Oded,

25
@ NPSF3000 - una lingua non è "lato server" o "lato client". Questa è una separazione architettonica - e forse una delle implementazioni del linguaggio (JavaScript è un linguaggio lato server o lato client - ricorda node.js).
Oded,

14
@FreeAsInBeer - questo è il tipo di logica che appartiene al lato client - qualcuno in Francia vorrebbe vedere date (e valuta / numeri) formattate in modo diverso da qualcuno negli Stati Uniti. Il cliente "saprebbe" meglio come devono essere visualizzati. Questa è la logica di presentazione e come tale appartiene alla vista.
Oded,

35

Piuttosto che rispondere direttamente alla domanda, la mia risposta mette in dubbio l'assunto formulato nella domanda. Cioè, il presupposto che Razor sia stato creato per MVC non è corretto. Lavoro in Microsoft nel team ASP.NET e ne ho una conoscenza diretta.

Razor non è nato come motore di visualizzazione per MVC. È stato creato per le pagine Web ASP.NET , che è probabilmente il più lontano possibile dal lato meno separato dello spettro. È stato creato come una moderna alternativa a ASP.NET Web Form / ASP classico e, naturalmente, a molti altri framework di programmazione server simili. L'idea di Razor era quella di creare transizioni quasi senza soluzione di continuità tra HTML (markup) e C # (codice).

Solo più tardi il team (che include me stesso) ha deciso che la sintassi del rasoio avrebbe avuto molto senso per il bene di un motore di visualizzazione per MVC, che era stato scritto dallo stesso team.

Se Razor abilita, ostacola, migliora o altera il concetto di separazione delle preoccupazioni in ASP.NET MVC, la risposta di Oded è esatta.


2
Sì, downvote senza un commento. Ho modificato la mia risposta per chiarire che sto mettendo in discussione l'assunto formulato nella domanda iniziale. A mio avviso, la domanda non è direttamente rispondente perché ha una premessa non valida.
Eilon,

Per curiosità, sono stati considerati altri motori di template per ASP MVC?
NWard

2
@NWard All'epoca c'erano diversi motori di visualizzazione di terze parti per ASP.NET MVC, ma non li abbiamo considerati troppo fortemente. Ritenevamo che Razor fosse più facile da capire (l'HTML è HTML, il C # è C #) e anche migliorato con il progetto Pagine Web ASP.NET.
Eilon,

1
@Alex oh non posso certo prendermi il merito di tutto il rasoio, ma apprezzo il tuo commento!
Eilon,

1
@ateri Dopo poco è il numero grande in alto a sinistra della risposta.
Mark Hurd,

9

Stai confondendo la "separazione delle tecnologie" con la "separazione delle preoccupazioni". L'idea di base dietro la parte "Visualizza" di MVC è che il codice nella "Vista" non sta eseguendo direttamente l'accesso ai dati o la logica pesante, piuttosto che è lasciato rispettivamente alle parti "Modello" e "Controller". "Controller" trasforma i dati, esegue qualsiasi logica necessaria e li instrada alla "vista" corretta. La vista può anche fare trasformazioni di dati, ma tendo a mantenerle puramente estetiche, come la trasformazione della data sopra menzionata.


questo non sembra offrire nulla di sostanziale rispetto ai punti sollevati e spiegati nelle risposte precedenti, in particolare questo
moscerino

4
+1 Formulato in modo conciso e chiaro e con un focus di spiegazione diverso rispetto alle risposte precedenti.
Alex,

@gnat Volevo solo chiarire dove fosse la sua confusione e quindi spiegare rapidamente come il principio di separazione delle preoccupazioni si applica al modello di progettazione MVC. Forse avrei dovuto dedicare più tempo al significato di "separazione delle preoccupazioni"?
whoisthemachine,

0

Mi viene in mente un Don't do itesempio perfetto .

Diciamo che abbiamo 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);
    }
}

Con il rasoio abbiamo un'alternativa

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

e a nostro avviso:

@model IEnumerable<Product> 

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

Penso che sia abbastanza ovvio che la seconda soluzione sembra così sbagliata. Se fai qualcosa del genere, non dare la colpa al rasoio, biasimati.

E non dimenticare: essere in grado di usare C # nelle viste non è una funzione di rasoio, ma è stato possibile anche con le viste ASP.NET. Con il rasoio è solo un po 'più semplice.

Se stai cercando un motore modello che è più binario come dovresti dare un'occhiata a nancy.fx con il motore di visualizzazione Super semplice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.