2011-01-11 22 views
7

Dopo aver lavorato con .net in winform e ASP.net per alcuni anni, ora sto iniziando a entrare in MVC (un po 'tardi lo so). Una delle maggiori confusioni per me è il concetto di "componenti" riutilizzabili, simile al concetto di un controllo elettronico nei webform.ASP> parziali riutilizzabili net MVC

Ad esempio, mi piacerebbe avere un certo numero di "widget" all'interno dell'area membri del mio sito, uno dei quali è i dettagli del gestore degli account degli utenti registrati. Posso creare questo come parziale tuttavia quando la pagina carica i dati devono essere passati come parte di ViewModel/View Data. Vorrei utilizzare questo widget in una serie di sezioni diverse che significherebbe che ho bisogno di inserire il codice per passare i dati in un numero di controller diversi. Questo sembra violare il principio ASCIUTTO o mi sto perdendo qualcosa qui? Preferirei che tutto fosse incapsulato all'interno del partial 1 che può quindi essere usato in qualsiasi pagina.

risposta

4

Si può andare in tre modi:

1) Per semplici controlli senza molta logica, è possibile creare nuova istanza della vista del modello personalizzato per il controllo: Html.RenderPartial ("YourControl", nuova YourControlViewModel() {Param1 = "value1", Param2 = Model.AnotherValue});

2) Se è necessaria una logica di back-end per il controllo, è possibile utilizzare Html.RenderAction ("NomeAzione", "NomeController", RouteValuesDictionary); Chiamerà l'azione del controller standard, utilizzerà la vista e inserirà l'output risultante nella pagina. È possibile aggiungere [ChildActionOnly] attributo al metodo controller per garantire che il metodo sia disponibile solo da Html.RenderPartial. Sta violando leggermente il principio MVC (vista non dovrebbe chiamare controller), ma è ottimo per i widget, ed è usato nel mondo di Ruby on Rails senza molti problemi. È possibile controllare grande articolo da Haacked

3) Creare helper HTML personalizzato per compiti come la formattazione data personalizzata, calcolo ecc ..

Nel tuo caso, vorrei scegliere il numero due.

+0

Questo ha molto senso - immagino che nel mio caso semplice potrei usare no. 1 e recupera l'utente attualmente connesso dal costruttore ViewModel, o n.2 se è necessaria l'interazione a 2 vie. – Macros

+0

Se il modello di vista ha l'id dell'utente, è possibile passarlo nei valori del percorso, usare 2) e memorizzare i dati nella cache. Un'altra opzione è quella di caricare l'utente loggato corrente dalla sessione, potrebbe essere molto semplice, ma viola alcuni principi. Segna la risposta se ti piace, grazie. – jhexp

Problemi correlati