2012-07-24 8 views
5

Sto provando a creare un percorso nella tabella di instradamento che indirizza a un elemento virtuale (utilizzando un cms che crea url come example.com/about/company, dove non esiste un file fisico chiamato società esistente) utilizzando system.web.routing (sfortunatamente non posso usare iis per riscrivere/instradare). Ho provato quanto segue ma ne risulta 404. Se dovessi puntare a un altro file fisico (tor testing purpose), il routing funziona correttamente.Instradamento all'elemento virtuale

void RegisterRoutes(RouteCollection routes) 
{ 
    routes.RouteExistingFiles = true; 
    routes.MapPageRoute("about", "about/us", "~/about/company", false); 
} 

Quindi, è possibile indicare un oggetto come quello?

+0

Si prega di dare un'occhiata a questo articolo che potrebbe aiutarvi con struttura di cartelle di routing: ** http: //www.codeproject.com/Articles/77199/URL-Routing-with-ASP-NET- 4-0 ** –

+0

Grazie ma sembra nell'articolo che l'autore punta anche al file fisico. – xoail

+0

Sì, ma se sono corretto penso che sia necessario reindirizzare a un file fisico e visualizzare il contenuto dipende dal valore che si sta passando. Anche i riferimenti che i punti articolo hanno alcune buone informazioni !! –

risposta

1

Speriamo che questo ti aiuti, questo esempio specifico è per Sitecore ma il progetto è open source e immagino che non sarebbe troppo difficile ri-utilizzare le parti necessarie per la soluzione.

L'essenza di questo progetto è consentire l'utilizzo del motore di routing MVC con una soluzione di moduli Web. Aggiungerò il cavetto di cui avrete bisogno per scavare nel codice un po ', ma spero che vi metta sulla strada giusta.

https://github.com/Sitecore/Sitecore-Mvc-Routing

1

Non sarà possibile raggiungere l'obiettivo desiderato con MapPageRoute. MapPageRoute funziona creando una nuova rotta con un PageRouteHandler. La documentazione per la PageRouteHandler Class afferma esplicitamente:

si passa un'istanza PageRouteHandler al costruttore percorso in fine di mappare un'URL di un file fisico. L'oggetto PageRouteHandler specifica il percorso virtuale del file fisico e determina se le regole di autorizzazione per l'URL fisico sono selezionate.

Se questa è un'applicazione MVC, esistono estensioni per il routing nello RouteCollectionExtensions Class. Si dovrebbe essere in grado di utilizzare il metodo MapRoute e dei mangimi i parametri predefiniti necessari per creare nuova rotta con un MvcRouteHandler in questo modo:

routes.MapRoute("about", "about/us", new { controller = "about", action="company", id="" }); 

Avrete bisogno di mettere nelle valori appropriati dal momento che non conosco il tuo progettazione del controller. Inoltre, dai uno sguardo allo Creating Custom Routes (C#), che potrebbe essere utile per capire come MVC gestisce il routing.

Se questa non è un'app MVC, è necessario implementare un gestore di route personalizzato derivato dallo UrlRoutingHandler Class e aggiungere una nuova Route a RouteCollection.

+0

Questa non è un'app mvc. Qualsiasi guida/esempio che punta alla creazione di gestori di percorsi personalizzati? – xoail

+0

Non l'ho provato da solo, ma penso che potresti essere in grado di sovrascrivere il metodo ProcessRequest nel tuo gestore derivato e farlo eseguire una chiamata 'Response.Redirect'. http://msdn.microsoft.com/en-us/library/cc680109(v=vs.90).aspx – JamieSee

1

Per il routing verso un target senza estensione come /content/something è necessario utilizzare la modalità integrata nel pool di applicazioni IIS. Se non puoi cambiare questo, allora non c'è un modo semplice per fare ciò che vuoi, oltre a configurare un gestore 404 personalizzato e gestire manualmente l'URL da lì. Questa è probabilmente la causa dei tuoi errori 404.

Inoltre, RouteExistingFiles dovrebbe probabilmente essere falso. Stai provando a instradare cose che non esistono come file. Se imposti RouteExistingFiles = true, la gestione predefinita dei file esistenti NON verrà utilizzata quando una rotta corrisponde. Tutto quello che vuoi fare è gestire percorsi che non esistono, ma rappresentare contenuti da un database, giusto? Quindi lascia questo falso.

Infine, l'istruzione MapPageRoute non è corretta. Ad esempio, nella procedura dettagliata di Microsoft, potrebbe assomigliare: http://msdn.microsoft.com/en-us/library/dd329551.aspx

routes.MapPageRoute("SalesRoute", 
    "SalesReport/{locale}/{year}", 
    "~/sales.aspx"); 

che causerebbe corrispondenti percorsi per invocare sales.aspx in risposta. Nel tuo esempio, l'obiettivo è ~/about/company che assomiglia a un percorso, non a un obiettivo effettivo: il tuo obiettivo effettivo che gestisce la richiesta CMS dovrebbe avere un'estensione aspx.