2012-12-20 10 views
38

mentre guardando un tema che ho scaricato dalla galleria Orchard CMS, ho notato che un file Layout.cshtml ha avuto questo blocco di codice nella parte superiore del file:Cosa fa un blocco di codice @functions in un file rasoio, e quando (se mai) dovrei usarlo?

@functions { 
// To support the layout classifaction below. Implementing as a razor function because we can, could otherwise be a Func<string[], string, string> in the code block following. 
string CalcuClassify(string[] zoneNames, string classNamePrefix) 
{ 
    var zoneCounter = 0; 
    var zoneNumsFilled = string.Join("", zoneNames.Select(zoneName => { ++zoneCounter; return Model[zoneName] != null ? zoneCounter.ToString() : ""; }).ToArray()); 
    return HasText(zoneNumsFilled) ? classNamePrefix + zoneNumsFilled : ""; 
} 
} 

so quale sia la funzione dichiarata fa (calcola quali zone sono popolate per restituire la larghezza di ogni colonna), la mia domanda è: qual è l'uso corretto del blocco @function e quando dovrei mai usarlo?

+0

Personalmente penso che dovrebbe essere evitato poiché confonde le acque in quello che è il livello di presentazione/visualizzazione e qual è il livello/livello di controllo aziendale. – Liam

+12

@Liam - Non sono d'accordo. Penso che dovrebbe essere espressamente usato allo scopo di * evitare * di confondere le acque. In questo esempio, è per scopi di determinare la larghezza della colonna, che non è qualcosa che il controller dovrebbe nemmeno sapere. – Bobson

+1

@bobson point preso – Liam

risposta

52

Il blocco @functions consente di definire le funzioni di utilità direttamente nella vista, anziché aggiungerle come estensioni all'helper @Html o consentire al controller di conoscere le proprietà di visualizzazione. Vorresti usarlo quando puoi soddisfare le seguenti condizioni:

  1. La funzionalità è strettamente legata alla vista e in genere non è utile altrove (ad esempio "Quanto largo faccio le mie colonne").
  2. La funzionalità è più di una semplice istruzione if e/o viene utilizzata in più punti nella visualizzazione.
  3. Per la vista è già presente tutto ciò di cui la funzione ha bisogno per determinare la sua logica. Model.

Se si fallisce il primo, aggiungerlo come un helper @Html.

Se si fallisce il secondo, è sufficiente inserirlo.

Se si fallisce il terzo, si dovrebbe fare il calcolo nel controller e passare il risultato come parte del modello.

+0

+1. Questa è un'ottima risposta. C'è un caso per usare '@ funzioni', ma non molto spesso! –

+1

Ottima risposta, in particolare la parte relativa alla spiegazione delle alternative da utilizzare: D –

+0

Risposta piacevole, grazie –

0

Da msdn blogs, funzioni @ blocco è di lasciare che si avvolge su codice riutilizzabile, come i metodi e le proprietà

0

In questo caso particolare, le persone che hanno creato il tema che si sta utilizzando, probabilmente stavano cercando di mantenere è un tema semplice (solo viste, css e immagini).

Se è necessario scrivere del codice per un tema per Orchard, è necessario passare a un modulo (come indicato qui: http://docs.orchardproject.net/Documentation/Anatomy-of-a-theme) a meno che non si scriva questo codice nella vista.

Non sono sicuro che valga la pena passare il tempo da un tema a un modulo solo per ottenere la dimensione di una colonna.

6

Altri hanno spiegato cosa fa @functions così non lo ripeterò. Ma vorrei aggiungere questo:

Se la tua vista è stata digitata su un viewmodel, penso che una valida opzione sarebbe quella di spostare questa logica nel viewmodel per evitare di ingombrare il tuo markup con troppo codice. Altrimenti le tue opinioni inizieranno ad apparire sempre più come ASP classico e non penso che nessuno lo voglia.

Io non credo che ci sia qualcosa di sbagliato con l'utilizzo di @functions o @helper nella vista, ma una volta arrivati ​​al di là di un paio di metodi nella vista, o anche se la funzione è un po 'complicato, forse vale la pena refactoring al viewmodel se possibile. Se è un codice che può essere riutilizzato, può essere una buona idea estrarlo in una classe helper o un'estensione della classe HtmlHelper. Una cosa che fa male è rendersi conto che hai appena riscritto un pezzo di codice che esisteva già perché non sapevi che era nascosto in una vista arbitraria.

Problemi correlati