2015-04-23 15 views
5

Sto utilizzando Sitecore 7.5 e Sitecore 8 (2 progetti separati con la stessa necessità). Abbiamo elementi di contenuto archiviati in bucket, ma non sono essi stessi elementi di pagina (non hanno alcuna presentazione legata a loro, sono solo elementi di dati e potrebbero provenire da fonti diverse, inclusi i bucket di articoli).Sitecore MVC Percorso personalizzato mentre si sta ancora utilizzando la pipeline di rendering Sitecore

Quindi, ecco un layout generale del problema: la pagina che vogliamo rendere oggetti con sarebbe qualcosa di simile /Sitecore/content/home/notizie abbiamo bisogno di essere in grado di analizzare il pathinfo dopo l'elemento nome come payload dei dati per il rendering del controller.

Quindi, quello che ho provato finora include la creazione di un percorso personalizzato in queste righe:

  routes.MapRoute(
      "Blog", 
      "blog/{*pathInfo}", 
      new 
      { 
       scItemPath = "/sitecore/content/Home/Blog", 
       controller = "Blog", 
       action = "DefaultAction" 
      }); 

ho caricare le rotte da pipeline RenderCustomRoutes, e ho configurato questo per essere chiamato da prima e dopo la pipeline Sitecore InitializeRoutes in diversi tentativi di test.

Ho fatto riferimento a questo da http://www.sitecore.net/learn/blogs/technical-blogs/john-west-sitecore-blog/posts/2012/10/using-sitecore-keys-in-mvc-routes-with-the-sitecore-aspnet-cms.aspx e ad alcuni articoli correlati.

A seguito di una serie di articoli aggiuntivi da lì dove rivede le sue istruzioni o passa ad affrontare altri problemi non risolve il mio scenario. Il fatto è che nessuno di questi funziona. In questo caso il controller viene chiamato correttamente, ma mentre ottengo l'elemento stesso nel contesto di rendering non ottengo alcuno dei restanti rendering della pagina. C'è un modo per lanciare la pipeline di rendering da qui, o per assemblare la pagina usando il resto dei dettagli di presentazione dell'elemento del blog e farlo manualmente?

L'altro itinerario ho provato stava solo cercando di passare il pathinfo come dati alla pagina del blog URL esistente, ma io alla fine con un 404.

Non so se sto inseguendo un Oca selvaggia qui e che c'è un modo migliore o se mi manca un pezzo da qualche parte. In Webforms probabilmente avrei fatto la riscrittura degli URL per ottenere ciò senza usare i querystring, ma speravo che le rotte sarebbero state progettate per gestire le cose proprio così e gli articoli che stavo vedendo sembravano indurmi a pensare che fosse possibile.

cose

addizionali Ho preso in considerazione: John West dice che ci sono 4 modi per Sitecore per gestire una richiesta MVC

1. ignorare la richiesta: Lasciare ASP.NET MVC gestirlo come se Sitecore non è stato installato, senza stabilire un contesto Sitecore.

2. Applicare un percorso: utilizzare il controller e l'azione specificati da un percorso MVC.

3. Applicare l'azione designata: utilizzare il controller e l'azione specificata nell'elemento di contesto.

4. Applicare una vista: Utilizzare il controller e l'azione predefiniti di Sitecore per richiamare la vista definita nei dettagli di layout per il dispositivo di contesto nell'elemento di contesto.

che cosa ottengo quando uso il percorso personalizzato sembra adattarsi # 2, ma quello che ho bisogno è qualcosa di più simile # 3 o # 4 pur utilizzando il percorso personalizzato.

risposta

3

Dal momento che gli articoli nel tuo bucket non hanno alcuna presentazione credo che sarà difficile gestirlo con i percorsi. Potrebbe essere possibile e, si spera, qualcun altro interverrà ma ...

È possibile utilizzare wildcard Items per ottenere ciò che si prova. Dipenderà dall'esatta configurazione e dalla struttura dei componenti, ma creerà semplicemente un oggetto chiamato * come figlio di /sitecore/content/Home/Blog. È quindi possibile impostare i dettagli della presentazione ecc su questo elemento jolly.

Ora, qualsiasi url corrisponderà questo oggetto. È necessario risolvere l'elemento a un certo punto, potrebbe essere nel controller stesso, sarà necessario analizzare l'URL e quindi cercare l'elemento da utilizzare nel rendering. Nota che Context.Item è ancora l'elemento jolly *, quindi si avrebbe dovuto creare una nuova variabile nel codice quindi popolare il tuo modello:

Item requestedItem = Sitecore.Context.Database.GetItem("resolved-path"); 
Model.Name = requestedItem.Name; 
Model.MyProperty = requestedItem["My Property"]; 

Tuttavia, probabilmente sarà meglio per risolvere l'oggetto dopo la pipeline ItemResolver e quindi memorizzare il GUID in Sitecore.Context.Items dizionario:

Item requestedItem = Sitecore.Context.Database.GetItem("resolved-path"); 
Sitecore.Context.Items["wildcard-guid"] = requestedItem.ID.ToString(); 

in questo modo è possibile utilizzare questo in diversi componenti e impostarlo come l'origine dati per i componenti (dal codice), ad esempio, breadcrumb, contenuto principale ecc. Ciò può essere utile anche da una prospettiva di memorizzazione nella cache poiché è possibile abilitare la memorizzazione nella cache utilizzando l'opzione VaryByData. È anche possibile lanciare un 404 appropriato se l'articolo non viene trovato impostando Sitecore.Context.Item = null se necessario.

È inoltre necessario essere in grado di gestire la generazione di collegamenti, quindi sarà necessario create acustom LinkProvider generare alcuni URL amichevoli.

Spero che abbia senso un po 'cosa! Devo fare qualcosa di simile presto e questa è l'opzione migliore che ho trovato finora ...

+0

Ci provo. Attualmente sto testando il supporto dell'editor di pagine per la soluzione che ho trovato. Riesco a ottenere la pagina come previsto in una forma molto semplice. Se ho la mia vista caricare gli altri rendering o anche esporre altri segnaposti, allora potrebbe fare tutto ciò di cui ho bisogno. Il mio pensiero sarebbe di avere il controllore decidere quale elemento di dati da referenziare e anche quale vista tornare nel caso in cui fosse necessario. Ci giocherò un po 'con questa idea e ti faccio sapere come si confronta o se riesco ad ottenerne di più! –

+0

Anche questa è una soluzione interessante. D'accordo con la separazione, e dovrebbe essere ancora possibile con i nodi jolly.In pratica passeresti per il guid dell'elemento di dati (post del blog) e quindi legerai staticamente quello nella tua vista. C'è un ulteriore wrapper View per raggiungere questo obiettivo, non ideale ma abbastanza semplice. Dato che il tuo rendering è datato, il supporto dell'editor di pagine continuerà a funzionare. – jammykam

+0

Sì, l'idea del nodo jolly è quasi ancora più semplice di una delle altre. È davvero tutto ciò di cui abbiamo bisogno, per aggirare il problema con le querystring. Il resto della pagina può essere impostato normalmente e il mio controller può caricare l'elemento solo in base a quel percorso. L'unico intoppo che riesco a vedere è che i percorsi vengono incasinati usando il formato gg/mm/aaaa. Posso vedere se possiamo usare i trattini invece –

3

Quindi, una risposta che ho trovato che non sono completamente soddisfatto del è questo:

creo una copia del mio layout, rende la vista e utilizzare @Html.Sitecore().Rendering("<id>", <datasource>) per rendere manualmente il resto della pagina . Funzionerà, ma non è elegante come mi piacerebbe vedere, quindi sono ancora aperto per una soluzione migliore.