Stack Overflow Domanda Routing
-
21-08-2019 - |
Domanda
Se si esamina un URL domanda così si vedrà che un ID e una "slug" vengono passate al controller Domande: https://stackoverflow.com/questions/676934/what-do-you-need-to-write-your-own-blog-engine . Quello che trovo interessante è che si può modificare la parte "slug" dell'URL senza compromettere la capacità dell'applicazione per inoltrare la richiesta di esempio . L'unico modo che ho potuto pensare a tirare fuori questo è avere un percorso che ha accettato un ID e una "slug" e ha utilizzato un vincolo percorso sulla lumaca per assicurarsi che ha seguito un modello. Ho dovuto usare un vincolo per assicurare che avere le due variabili non ha portato a questo percorso corrispondenza tutte le richieste. Qualcuno ha un modo migliore per ottenere questo risultato, o qualsiasi esempi di scenari di routing più avanzato?
AGGIUNTA:
Mi rendo conto che la lumaca è per leggibiltà umana, e vorrei duplicare questa funzionalità in un'altra applicazione. Qual è il modo migliore per raggiungere questo obiettivo.
Percorso:
routes.MapRoute(
"Id + Slug", // Route name
"Test/{id}/{slug}", // URL with parameters
new // Parameter defaults
{
controller = "Test",
action = "Details",
id = "",
slug = ""
},
new { slug = new SlugConstraint() }
);
Constraint semplice:
public class SlugConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection)
{
string value = values[parameterName].ToString();
return value.Contains("-");
}
}
Soluzione
questo quello che stai cercando ... non definisce la lumaca alla fine.
Altri suggerimenti
Non è necessario utilizzare la lumaca a tutti. Probabilmente è lì solo per la leggibilità umana e l'ottimizzazione dei motori di ricerca. È possibile ignorare quando il routing e solo di lavoro fino alla ID.
Per esempio, clicca qui:
La lumaca è lì per i motori di ricerca per catalogare la risorsa / pagina. Non è usato nel percorso a tutti come parte degli argomenti passati al database per recuperare il posto richiesto.
L'ID è la parte importante.
Quindi, nel codice, lo SlugConstraint non è richiesto e il valore dell'argomento slug viene ignorato nell'azione Dettagli.
Questo comportamento è ciò in modo da fare e che cosa si può fare, se u vogliono copiare SO.
Il "percorso" può essere qualsiasi cosa il router può essere configurato per gestire. Le parti dinamiche del "percorso" sono poi passati alla pagina di destinazione / target e recuperati tramite il metodo RouteValue () (in ASP.NET Routing). Quello che fai con quei valori sulla pagina di destinazione è interamente a voi. Usali o ignorarli.
Così l'ID (nel tuo esempio) è la chiave e il resto (la lumaca) è lì solo per la leggibilità umana e SEO.