2013-04-09 7 views
9

Se ci si dirige verso il seguente URL StackOverflow http://stackoverflow.com/questions/15532493 viene automaticamente aggiunto con il titolo della questione in questo modo:StackOverflow URL stile (personalizzazione URL in uscita)

http://stackoverflow.com/questions/15532493/mvc-custom-route-gives-404

Cioè, posso digitare l'URL nel mio browser senza il titolo della domanda e viene aggiunto automaticamente.

Come posso ottenere lo stesso risultato nella mia applicazione? (Nota: sono consapevole che il titolo della domanda non ha effetto sulla pagina che viene renderizzata).

Ho un controller chiamato Users con un metodo di azione denominato Details. Ho definito il seguente percorso:

routes.MapRoute("UserRoute", 
    "Users/{*domain}", 
    new { controller = "User", action = "Details" }, 
    new { action = "^Details$" }); 

Poiché si tratta di un'applicazione Intranet, l'utente è autenticato rispetto al proprio account Windows. Voglio aggiungere il dominio e il nome utente all'URL.

Se ho generato l'URL nella vista in questo modo:

@Html.ActionLink("Model.UserName", "Details", "User", new { domain = Model.Identity.Replace("\\", "/") }) 

ottengo un URL che assomigliano a questo:

dominio/Utenti/ACME/jsmith

Tuttavia, se l'utente naviga verso l'URL Domain/Users/ utilizzando la barra di navigazione del browser, corrisponde alla rotta e l'utente viene indirizzato alla pagina dei dettagli dell'utente. Vorrei aggiungere lo ACME/jsmith/ all'URL in questo caso.

La ricerca che ho fatto finora indica che potrei avere per implementare un oggetto percorso personalizzato derivando dalla RouteBase e attuare le GetRouteData e GetVirtualPath metodi, ma non so da dove cominciare con questo (la documentaiton MSDN è molto sottile) .

Quindi quello che vorrei sapere è:

  1. Esiste un modo per raggiungere questo senza l'attuazione di un percorso personalizzato?
  2. In caso contrario, qualcuno sa di buone risorse per iniziare a implementare un percorso personalizzato?
  3. Se è richiesta un'implementazione personalizzata del percorso, come si ottiene l'informazione che presumibilmente deve essere caricata dal database? Va bene fare in modo che un servizio effettui chiamate al database in una rotta (che a me sembra sbagliato) o le informazioni possono essere passate al percorso dal framework MVC?
+1

http://stackoverflow.com/questions/25259/how-does-stackoverflow-generate-its-seo-friendly-urls –

+2

@ Soner Gönül - La domanda collegata mostra 'how-to-generate-stringhe-like-this' che non è quello che sto chiedendo. Voglio aggiungere i valori all'URL se l'utente inserisce solo il bit 'Dominio/Utenti /' nella barra di navigazione del browser. –

+1

Non è in realtà un duplicato poiché non sta chiedendo come generare la stringa del titolo, ma come reindirizzare sempre a una pagina in cui il titolo è nell'URL anche se l'utente è arrivato semplicemente inserendo l'id – tucaz

risposta

2

In realtà è piuttosto semplice. Poiché il titolo è solo per ragioni SEO, non è necessario arrivare alla domanda vera e propria, quindi il controller Domanda (nel caso SO) caricherà la domanda corretta in base all'ID (nell'URL) e reindirizzerà l'utente con un 301 codice di stato.

Si può vedere questo comportamento con qualsiasi ispettore web

enter image description here

+0

Grazie, questo è quello che stavo per provare in origine ma non mi sembrava giusto; Credo che dovrei imparare a fidarmi del mio istinto. Proverò più tardi per vedere se riesco a farlo funzionare. Ho ragione nel ritenere che ciò significa che il database verrà colpito 2 volte? –

+0

Sì, ma SO ha probabilmente una sorta di memorizzazione nella cache o di optmization in modo che possano tradurre gli ID in titoli delle domande e non colpiscano il database due volte con il pieno carico. – tucaz

+0

Funziona perfettamente. Grazie mille. Sono un po 'a disagio con il doppio colpo sul database, ma sto solo tirando giù una piccola quantità di informazioni e non mi aspetto nulla di simile al traffico di Stackoverflow, quindi attraverserò quel bridge e implementerò una politica di caching se diventa un problema –

1

si potrebbe fare sul lato client con JavaScript:

history.pushState({}, /* Title Here */, /* URL Here */); 

L'unico lato negativo non è tutti i browser supportano.