Routing Restful per ASP.NET MVC, basato sul Ruby on Rails routing DSL. Utlizza i verbi HTTP per mantenere i percorsi unici al minimo, ottimizzando al contempo la struttura dei controller.

PM > Install-Package RestfulRouting

Benvenuti a Restful Routing per ASP.NET MVC! Il routing è probabilmente al centro di tutto ASP.Net Applicazioni MVC. Gestire i percorsi da soli può essere ingombrante, frustrante e improduttivo. Alcuni sviluppatori utilizzano un percorso catch-all, che può portare a problemi imprevisti come l’applicazione cresce. Restful Routing risolve il problema di gestione del routing fornendo un’interfaccia supponente di registrazione dei percorsi.

Ci auguriamo che questa libreria è così facile da usare che vi chiederete come mai sviluppato ASP.Net Applicazioni MVC senza di essa.

Golden Seven

Restful Routing si basa sull’idea di Resources e le azioni Golden Seven:

Azione HTTP Metodo
INDICE OTTENERE
MOSTRA OTTENERE
CREARE POST
NUOVO OTTENERE
EDIT OTTENERE
AGGIORNAMENTO METTERE
DISTRUGGERE ELIMINA

L’obiettivo di riposo di Routing è quello di rendere cosciente del tuo controller. Mentre puoi piegare le regole quando appropriato, dovresti davvero concentrarti sul mantenere tutti i controller limitati a queste sette azioni. Se combatti le convenzioni del Routing Restful, non sfrutterai la forza del nostro quadro supponente e sarai infelice nel farlo.

Percorso predefinito

Prima di immergermi nel routing Restful, vorrei discutere il percorso predefinito fornito da ASP.NET MVC. Trovato in molti modelli di avviamento, è uno strumento utile per iniziare, ma non è consigliabile utilizzarlo per qualsiasi ambiente di produzione. Elencherò i motivi di seguito:

  • Qualsiasi controller nel tuo progetto sarà accessibile anche se non registrato con un framework di routing come Restful Routing.
  • Può portare a una risoluzione imprevista del percorso verso l’esterno e ore di debug.

Punto 1. Installazione di Restful Routing

Per iniziare, assumeremo che tu stia iniziando con un ASP.Net Progetto MVC e capire come arrivare a quel punto.

Aprire la console di Gestione pacchetti e digitare quanto segue:PM> Install-Package RestfulRouting.

Se non si desidera utilizzare la console di Gestione pacchetti, è possibile fare clic con il pulsante destro del mouse sul progetto Web e selezionare la voce di menu contestuale “Gestisci pacchetti Nuget”. Cerca RestfulRouting installa il pacchetto.

Punto 2. Configurazione del routing Restful

Un paio di modifiche dovrebbero essere avvenute al progetto, ovvero sono stati aggiunti due file: Routes.cse ApplicationController.

Routes.cs dovrebbe apparire come la sezione a destra. Abbiamo un piccolo aiuto già incluso per te in questo file. Non tutti stanno scrivendo un’applicazione blog, quindi sentitevi liberi di cancellare il codice commentato dopo aver guardato su di esso.

Nota la dipendenza da WebActivator, questo garantirà che le rotte vengano registrate all’avvio dell’applicazione. Puoi scegliere di rimuovere questa dipendenza se preferisci chiamare tu stesso il metodo Start.

// setting the root routemap.Root<HomeController>(x => x.Index());

Per la configurazione, assicurarsi di Root;

Oltre a Routes.cs otterrai anche ApplicationController. L’utilizzo di questo controller di base è facoltativo, ma ha il codice necessario per utilizzare i risultati del formato

Passaggio 3. Visualizza la configurazione del motore (opzionale)

ASP.Net MVC dipende dai motori di visualizzazione per individuare le visualizzazioni. Mentre il motore di visualizzazione predefinito è ok, abbiamo scoperto che la struttura delle cartelle è un po ‘ prolissa. Se desideri utilizzare i nostri motori di visualizzazione, cambia il tuo Globale.file asax per assomigliare al seguente.

Il gioco è fatto. Codice! Codice! Codice!

Se vuoi saperne di più su come e cosa sta succedendo nella registrazione dei tuoi percorsi continua a leggere.

RouteSet

In questa sezione, imparerai a conoscere RouteSet. La classe è fondamentale per far funzionare il routing Restful.

Nozioni di base

Un RouteSet è una raccolta di mappature di percorsi. Non solo definisce i percorsi nell’applicazione, ma può connettersi ad altri routeset, creando un ricco set di percorsi con il minimo sforzo.

Tutte le rotte sono definite all’interno del metodo Map di un RouteSet.

L’istanza IMapper passata in Map presenta un modo per mappare i tuoi percorsi al dizionario RouteTable al centro di ogni ASP.Net Applicazione MVC. Se hai installato il Routing Restful tramite Nuget, avrai notato un RouteSet già creato per te.

Collegamento

A volte si desidera separare logicamente i routeset. Invece di raggruppare tutti i percorsi in un unico RouteSet, forniamo la possibilità di collegare ROUTESET. È necessario selezionare un RoutSet per essere la radice dei tuoi routeset, dopo di che è possibile collegare altri routeset in qualsiasi modo si desideri. I routeset supportano anche gli spazi dei nomi, simili alle aree.

Configurazione (opzionale)

Un RouteSet fornisce impostazioni che possono modificare il comportamento della registrazione del percorso. Queste proprietà possono essere trovate nel contesto di un RouteSet. La maggior parte degli sviluppatori non vorranno toccare queste caratteristiche.

l’Impostazione di Default Risultato
LowercaseUrls true registrare gli url in minuscolo impostazioni cultura invarianti
LowercaseDefaults true registra le tue azioni, una volta registrati, normalmente in minuscolo impostazioni cultura invarianti
LowercaseActions true registra le tue azioni, una volta registrati, con Percorso in minuscolo impostazioni cultura invarianti
MapDelete false registrare un azione aggiuntiva di Delete . Utilizzato per visualizzare una pagina di conferma eliminazione prima di rimuovere una risorsa.

Mapping

Restful Routing è un framework di mappatura e per eseguire la mappatura forniamo un insieme di concetti e interfacce. Leggi ogni interfaccia qui sotto e quali funzionalità ciascuno fornisce in dettaglio.

Root

map.Root<HomeController>(x => x.Index());

Ogni applicazione ha bisogno di una pagina predefinita e registrare un percorso di root non è mai stato così facile. Se la tua applicazione è stata ospitata in , allora sarebbe considerata la radice.

L’applicazione può avere una sola radice.

Risorsa

map.Resource<ProfileController>();

Una risorsa è una “cosa” che può essere pensata singolarmente dal punto di vista dell’utente dell’applicazione. Un profilo per un utente autenticato è un buon esempio di una risorsa. Dai un’occhiata al seguente url. Quando si tratta di un profilo, si ricava l’identificatore tramite un cookie (o altri mezzi impliciti) e non è necessario l’identificatore nel percorso del percorso.

L’url presuppone che l’applicazione sappia cos’è un profilo e come presentarlo. Ora come apparirebbe la registrazione in un RouteSet?

Azioni e metodi Http

Quando si registra una risorsa, viene registrato automaticamente un insieme di azioni e metodi. Registra il tuo controller e implementa le azioni.

Azione HTTP Metodo
MOSTRA OTTENERE
CREARE POST
NUOVO OTTENERE
EDIT OTTENERE
AGGIORNAMENTO METTERE
DISTRUGGERE ELIMINA

Per il nostro esempio, con la ProfileController, si ottiene il seguente output:

Azione HTTP Metodo Risultato (controller#azione) Url
MOSTRA GET profilo di#show /profilo
NUOVO GET profilo di#nuovo /profilo/nuovo
CREARE POST profilo di#creare /profilo
EDIT GET profilo di#modifica /profilo/modifica
AGGIORNAMENTO INSERISCI profilo di#update / profilo
DISTRUGGI ELIMINA profilo # distruggi /profilo

Denominazione

A volte si nomina il controller una cosa, ma si desidera che l’URL della risorsa rifletta qualcosa di completamente diverso. Questo è semplice da fare.

Il nuovo url per profile#show verrà modificato nel metodo

Additionally, you can change the default action names of a resource by using the PathNames. Questo non è raccomandato, ma ci piace darvi opzioni.

Scegliendo Azioni

A volte potresti non aver bisogno di tutti i metodi che forniamo per una risorsa. Immagina i seguenti esempi:

  • Come utente, non dovrei essere in grado di creare un profilo, perché viene creato implicitamente quando ci siamo registrati.
  • Come utente, dovrei essere in grado di modificare il mio profilo corrente.
  • Come utente, non dovrei essere in grado di eliminare il mio profilo.
  • Come utente, dovrei essere in grado di vedere il mio profilo

Dopo la revisione, abbiamo solo bisogno di registrare le seguenti azioni: Show, Edit, Update. Per limitare la nostra risorsa a tali azioni, useremmo il seguente codice nel nostro RouteSet.

Nidificazione di una risorsa

// NESTING A RESOURCEmap.Resource<ProfileController>(profile => { profile.Resource<CreditCardController>()});

Una risorsa a volte dipende da un’altra risorsa. Quando si annida una risorsa, si ha una relazione uno a uno tra la risorsa padre e la sua risorsa dipendente.

Se crei una risorsa creditcard e la annidi nella nostra risorsa profile (come indicato a destra) otterrai i percorsi risultanti, escludendo i percorsi del profilo:

Action HTTP Method Result (controller#action) Url Template
SHOW GET creditcard#show /profile/creditcard
NEW GET creditcard#new /profile/creditcard/new
CREATE POST creditcard#create /profile/creditcard
EDIT GET creditcard#edit /profile/creditcard/edit
UPDATE PUT creditcard#update /profile/creditcard
DESTROY DELETE creditcard#destroy /profile/creditcard

Resources

map.Resources<ProductsController>();

Resources represent collections withing your domain. Immagina di creare un’applicazione store, potresti voler esporre il tuo catalogo in modo che i clienti possano cercare e acquistare prodotti. I prodotti sarebbero considerati risorse. L’URL che viene generato rifletterebbe anche che ci sono molti prodotti da offrire.

Notare la pluralizzazione dei prodotti. Se stai iniziando un sito di e-commerce, molto probabilmente venderai più di un prodotto alla volta.

Azioni

Quando si registrano le risorse, una serie di azioni e metodi vengono registrati automaticamente. Registra il tuo controller e implementa le azioni.

Azione HTTP Metodo
INDICE OTTENERE
MOSTRA OTTENERE
CREARE POST
NUOVO OTTENERE
EDIT OTTENERE
AGGIORNAMENTO METTERE
DISTRUGGERE ELIMINA

Per il nostro esempio, con la ProductsController, si otterrebbe il seguente output:

Denominazione

A volte si nomina il controller una cosa, ma si desidera che l’URL delle risorse rifletta qualcosa di completamente diverso. Questo è semplice da fare.

Il nuovo url verrà modificato per i prodotti#index.

Inoltre, è possibile modificare i nomi delle azioni predefinite di una risorsa utilizzando il metodo PathNames. Questo non è raccomandato, ma ci piace darvi opzioni.

Personalizzazione del parametro {id}

Per impostazione predefinita, il nome id viene utilizzato per il parametro id risorsa nei modelli URL di route. Ad esempio, il modello URL per l’azione products#show nelle azioni e nei metodi HTTP sopra è /products/{id}.

In alcuni scenari, è possibile utilizzare un nome diverso per il parametro. Forse vuoi che il nome del parametro corrisponda al nome della proprietà utilizzata per identificare la risorsa:

Il percorso aggiunto per l’azione users#show avrebbe quindi il pattern URL /users/{username}.

Scegliendo Azioni

A volte potresti non aver bisogno di tutti i metodi che forniamo. È possibile rimuovere le azioni utilizzando i metodi follwing sulla destra.

Risorse di nidificazione

map.Resources<ProductsController>(products => { products.Resources<ReviewsController>()});

Le risorse a volte dipendono da altre risorse. Quando si annidano le risorse, si ha una relazione uno a molti tra la risorsa padre e le sue risorse dipendenti. Pensa a un prodotto che ha reviews.To a tale scopo si registrerebbero le due risorse in questo modo.

Percorsi membro e raccolta

Utilizzare i metodi Member e Collection all’interno delle risorse per aggiungere percorsi alla raccolta (senza un parametro id route) o al membro (con un parametro id route). I metodi disponibili per mappare sono Get, Post, Put, Delete e Head. Quando si trova nel contesto di una risorsa (singolare), si avrà accesso solo al metodo Member.

Mappatura standard

<!-- IN RAZOR VIEW --><a class="btn" href="@Url.Action("usingpath", "extras")">Path</a><a class="btn" href="@Url.Action("usingroute", "extras")">Route</a>

A volte le nostre convenzioni non funzionano per te. Possiamo essere supponenti, ma non governiamo con il pugno di ferro.

Sono forniti due metodi aggiuntivi in modo da poter aggiungere percorsi personalizzati: Path è un mix di tradizionali ASP.Net Sintassi di routing MVC con il nostro wrapper di interfaccia. Route è un modo molto tradizionale di aggiungere un percorso personalizzato.

Aree

Le aree sono gestite dallo spazio dei nomi nel routing Restful. Di solito c’è una correlazione tra cartelle e spazi dei nomi, quindi per la maggior parte degli sviluppatori questa non è una grande differenza da ciò che già fanno.

Il controller fornito al metodo Area viene utilizzato per determinare lo spazio dei nomi per i controller raggruppati. La stringa “mapping” viene utilizzata per determinare il nome dell’area, insieme alla parte url.

Ricorda che dovrai fornire l’area durante la generazione degli URL. Per uscire da un’area, è possibile impostare l’area su una stringa vuota. Tutte le regole con una Risorsa e le Risorse si applicano ancora quando si tratta di Aree.

Motori di visualizzazione

Il routing Restful viene fornito con due motori di visualizzazione: RestfulRoutingRazorViewEngine e RestfulRoutingWebFormViewEngine. Diamo un’occhiata a quello di questi motori di visualizzazione.

Questi motori di visualizzazione cambiano il modo in cui ASP.Net MVC cercherà le viste.

Risultato del formato

Questa è una funzione che consente di utilizzare estensioni di formato implicite su una risorsa e risorse. Esistono due metodi principali per questa funzione: RespondTo, WithFormatRoutes.

<system.webServer> <modules runAllManagedModulesForAllRequests="true" /></system.webServer>
namespace RestfulRouting.Documentation.Controllers{ public abstract class ApplicationController : Controller { protected ActionResult RespondTo(Action<FormatCollection> format) { return new FormatResult(format); } }}
// IN ROUTESET// enable format routesextras.WithFormatRoutes();

Forniamo una serie di tipi noti fuori dalla scatola per rendere utilizzando la nostra interfaccia fluent un po ‘ più bello, ma supportiamo qualsiasi estensione di file si può pensare. Per generare questi percorsi di formato basta specificare il formato come segue.

Fantastico giusto?! Ti consigliamo di leggere la seguente sezione di Quirks / Gotchas se prevedi di utilizzare i percorsi di formato.il suo è utile se stai costruendo applicazioni a pagina singola Con parsimonia e capisci quando è opportuno separare la funzionalità nelle tue azioni.

Redirect Dead Links

Ci sono momenti in cui prendiamo decisioni url migliori di altri. Vogliamo la possibilità di modificare gli URL, senza rompere gli URL esistenti. Questo è necessario solo una volta che l’applicazione va in diretta. Ciò si applica principalmente ai siti pubblici, ma potrebbe essere utile in una situtazione intranet.

La prima cosa da notare è che dovresti registrare tutti i tuoi percorsi di reindirizzamento come ultimi percorsi nella tua lista. Questo perché sono i meno importanti. Il sarà sempre e solo essere colpito quando si accede a un vecchio link. La tua applicazione non dovrebbe generare questi URL e, se lo è, hai problemi.

In secondo luogo, la registrazione sembra la buona vecchia sintassi di RestfulRouting, ma non richiede di annidarla all’interno di alcuna definizione. Vorrei raccomandare, creando un RouteSet chiamato DeadLinks o Redirect e collegandolo alla fine del tuo RouteSet principale.

Infine, e questo è importante, registrare il RedirettRouteFilterAttribte come un filtro globale.

Come puoi vedere a destra, basta impostare il vecchio URL e fornire valori da risolvere sul nuovo url. Usiamo l’UrlHelper sotto le coperte per trovare il miglior percorso di corrispondenza.

Route Debugger

// IN ROUTESETmap.DebugRoute("routedebug");

Restful Routing è dotato di un potente route debugger volto ad aiutare a capire le mappature del percorso. È possibile abilitare e disabilitare il debugger route semplicemente aggiungendo la seguente riga al RouteSet.

Quirks / Gotchas

Questa sezione tenta di dettagliare alcune stranezze con ASP.NET MVC e Routing Restful. Questi possono causare problemi a volte ed è bene capire perché e quando possono influire sulla tua applicazione.

Valori di percorso persistenti

ASP.Net MVC cerca sempre di essere utile. Utile, anche se ben intenzionato, può portare a qualche comportamento strano a volte. Il problema più grande può essere salvato i valori del percorso dalla richiesta esistente.

Comprendere questa stranezza può aiutarti a eseguire il debug di molti problemi, non solo con il routing Restful, ma con ASP.NET MVC in generale. Puoi vedere l’esempio a destra.

Livelli di mappatura di miscelazione

map.Resource<ProfileController>(profile => { // DOH! should be profile // not map! // EXCEPTION!!!! map.Resource<CreditCardController>()});

Il routing Restful è progettato per essere fluente e nidificato. Durante la creazione di RouteSet potresti accidentalmente chiamare il parametro sbagliato, causando un errore che potrebbe essere difficile da diagnosticare. La nostra eccezione è utile, ma questo è un errore abbastanza comune che abbiamo deciso di documentarlo.

Spazi dei nomi e conflitti dei nomi

A volte vogliamo nominare i controller allo stesso modo, ma li abbiamo in spazi dei nomi diversi. Questo è appropriato quando si crea una sezione amministrativa e frontale del sito. Basta ricordarsi di impostare gli spazi dei nomi in modo appropriato in modo che il Routing possa istanziare il controller corretto.