2010-05-26 19 views
5

Mi ritrovo a scrivere molto codice nelle mie visualizzazioni che assomiglia al seguente codice. In questo caso, voglio aggiungere un codice HTML esplicativo per un principiante e un codice HTML diverso per un utente esperto.Logica di ramificazione in una vista MVC

<% if (ViewData["novice"] != null) { %> 
some extra HTML for a novice 
<% } else { %> 
some HTML for an expert 
<% } %> 

Questa è la logica di presentazione, quindi ha senso che sia in una vista rispetto al controller. Tuttavia, diventa brutto molto velocemente, specialmente quando ReSharper vuole spostare tutte le parentesi per renderlo ancora più brutto (c'è un modo per disattivarlo per le viste?).

La mia domanda è se questo è corretto, o dovrei diramazione nel controller a due viste separate? Se faccio due viste, avrò un sacco di HTML duplicato da mantenere.

O dovrei fare due viste separate con una vista parziale condivisa delle cose che sono in comune?

risposta

2

Idealmente, questo tipo di logica verrebbe gestito nel modello di vista e la vista dovrebbe semplicemente rendere il modello.

Così si potrebbe avere qualcosa di simile a suo avviso:

<%= ViewData["helptext"] %> 

e la logica del controllore sarebbe qualcosa di simile:

ViewData["helpText"] = isNovice ? noviceText : expertText; 

in questo modo si può spingere questa logica al controller e mantenere i vostri punti di vista belli e puliti

+0

Riesco a vedere il vantaggio di questo, ma cosa succede se il testo è un codice HTML complesso, ad esempio con immagini e altro? Ora hai HTML nel tuo controller. Inoltre, grazie per aver corretto il mio esempio di codice –

+0

Nice lomax molto meglio. Mi piace. +1 –

+0

Dipende dalla situazione in cui si trova il testo complesso e quanta modifica è richiesta, ma non vedo perché lo stesso approccio non possa essere utilizzato per il rendering delle parti variabili? – lomaxx

1

Stai provando a creare 2 pagine html completamente separate con modelli identici. Vuoi una visione separata. Non cercare di creare uno schema di progettazione intelligente con logica di ramificazione condizionale.

Gli helper HTML non ti aiuteranno molto qui, poiché sembra che non si stia ripetendo più logica se non altro.

+0

Tutto quello che posso dire che anche senza aver ripetuto la logica preferirei usare un helper invece di duplicare il codice. La duplicazione del codice causa solo mal di testa di manutenzione e dovrebbe essere corrucciata su –

+0

Non penso che si desidera una vista separata in quanto creerebbe un ulteriore sovraccarico di manutenzione. Sarei più propenso a riportare la logica al controller e ad avere una singola vista pulita – lomaxx

+0

Puoi inserire il codice ripetuto in partial, ma un'immagine grande sembra che tu voglia due viste separate, cioè "HTML diverso per un utente esperto" Ripetizione il codice è cattivo, lavorare contro un modello di progettazione è peggio IMO. –