2012-03-04 27 views
8

Ho un cliente che desidera utilizzare una convenzione URL di denominazione lungo le linee di:ASP.Net MVC con percorsi complessi - come mantenerlo "sano di mente"?

/{subjectarea}/{subject}/{action} 

Che va bene - questo funziona brillantemente, con un controller per argomento, e avendo l'azione dopo l'id (soggetto) non è affatto un problema.

Tuttavia, poi si fa complicata, in quanto il cliente vuole poi proseguire ulteriormente la gerarchia:

/{subjectarea}/{subject}/{action}/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction} 

Ho un controller per il strettamente correlata soggetto (il suo solo un altro argomento), che gestisce tutte le dal lato dell'amministratore, ma il cliente insiste per avere la visione pubblica appesa al soggetto principale piuttosto che alla propria radice.

Come posso fare questo evitando di rompere gli interi principi di MVC, ed anche evitando di ri-implementare una tonnellata di funzionalità MV.Net fornita da ASP.Net nel mio controller di area soggetto solo per essere in grado di gestire i soggetti correlati da quello stesso controllore?

È possibile chiamare in qualche modo il responsabile dei temi correlati dall'interno del controllore soggetto genitore e restituire la visualizzazione risultante (in quanto ciò manterrebbe la separazione delle funzionalità per i soggetti ai propri controllori)? Se è possibile, risolverebbe un sacco di problemi con questo.

risposta

2

Ecco la soluzione che risolve il mio problema dato - spero che risolva qualcun'altro.

Come accennato nel mio commento a Robert Harvey, tutto ciò di cui ho effettivamente bisogno è un'altra rotta che non utilizza i primi due o tre componenti come controller, azione e id, ma prende invece quei valori da un momento successivo - se si appendi questo valore statico anche nel percorso, è molto più facile da fare.

Così, qui è l'url ho deciso di semplificare il percorso:

/{subjectarea}/{subject}/related/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction} 

Il percorso che soddisfa questo URL è la seguente:

 routes.MapRoute(
      "RelatedSubjects", 
      "{parentcontroller}/{parentsubject}/related/{controller}/{id}/{action}", 
      new { controller = "shoes", action = "view", id = "all" } 
     ); 

sulla successiva azione di controllo, posso chiedi i valori dei parametri per controllore genitore e genitori in modo che io possa filtrare l'elemento correlato per essere solo specifico per il soggetto genitore dato - problema risolto!

Questo percorso deve essere al di sopra di quelli che si occupano solo dei primi due valori, altrimenti si corre il rischio che un'altra mappa del percorso possa dirottare la richiesta.

Potrei fare tutto questo senza la parte/related/static poichè la route potrebbe facilmente corrispondere sul numero di valori da sola, e infatti potrei davvero farlo - tuttavia, lo considero migliore per la successiva amministrazione se c'è una staticità elemento in là per confermare l'uso del percorso.

Spero che questo aiuti qualcuno!

+0

Questo è esattamente ciò che cercavo anche, utilizzando un nuovo controller di visualizzazione ma mantenendo l'accesso al controller principale e ai parametri padre. Grazie per aver pubblicato i tuoi risultati. –

1

Un modo per farlo è specificare un percorso jolly (notare l'asterisco):

routes.MapRoute("subjects", "{action}/{*path}", 
    new { controller = "Subjects", action = "Index" }); 

Questo permette al controller di ricevere l'intera stringa di percorso dopo la action.

È possibile quindi ottenere la gerarchia dei soggetti nel metodo di controllo in questo modo:

string[] subjects = path.Split('/'); 

Una volta che avete che, si può fare tutto quello che vuoi, compreso l'invio soggetti diversi a diversi metodi di trattamento per l'elaborazione.

+0

Questo è il modo in cui ho preso in considerazione prima di pubblicare la domanda - tuttavia, ha l'effetto collaterale di buttare via la maggior parte di ciò che ASP.Net MVC mi fornisce in quanto vi è un sacco di "routing" che dovrei fare da mano nel metodo del controller che gestisce l'azione - era quello che stavo tentando di evitare. Se potessi scegliere il valore del controller relatedsubjects, action e id, allora posso lasciare tutto al controller di destinazione, piuttosto che dover reimplementare tutto sul controller corrente (che violerebbe anche il principio di responsabilità singola). Ha senso? – Moo

+0

Vale la pena sottolineare che il problema non è come ottenere i valori dal percorso, ma come ottenere la visualizzazione risultante dal controller corretto, mentre all'interno di un controller diverso - se fosse possibile farlo ... e io scappare nel pensiero come qualcosa mi viene in mente. Tutto ciò di cui ho veramente bisogno è un altro stato in cui i primi tre valori sono * non * considerati il ​​controller, l'azione o l'id, ma solo più dati e i valori di actaul per controller, action e id sono presi da più lungo il percorso .... hmmm – Moo

Problemi correlati