Domanda

Abbiamo un sito Web che si occupa di artisti e luoghi e lo stiamo sviluppando in ASP.net MVC.

Abbiamo le visualizzazioni dei nostri artisti in una cartella (Views / Artists / ..), in ArtistsController, ArtistsRepository e aderiamo ai nomi delle azioni REST come Show, New, Delete ecc.

Quando abbiamo deriso il sito per la prima volta, tutto ha funzionato bene nel nostro ambiente di test poiché i nostri URL di test erano / artisti / Mostra / 1209 ma dobbiamo cambiarlo in modo che il sito web appaia come / artisti / Madonna e / artisti / Foo-Fighters ecc.

Tuttavia, come possiamo distinguere tra nomi di artisti validi e nomi delle azioni per quel controller ?! Ad esempio, artisti / PostComment o artisti / DeleteComment? Devo consentire al routing di gestirlo. Il nostro percorso predefinito Show è:

routes.MapRoute(
               "ArtistDefault",
               "artists/{artistName}",
               new { controller = "Artists", action = "Show", artistName = ""}

Un modo per aggirare il problema è che il nostro sito web funzioni visibilmente su / artisti, ma il nostro controller venga rinominato nel singolare - ArtistController - al contrario di ArtistsController. Ciò andrebbe contro le convenzioni di denominazione con cui siamo entrati quando abbiamo iniziato (ma hey!).

Hai altri consigli? Se possibile, potremmo anche instradare a seconda dei verbi (quindi PostComment sarebbe un POST, quindi potremmo forse indirizzarci a quell'azione), ma non sono sicuro che sia consigliabile, tanto meno possibile.

Grazie

È stato utile?

Soluzione

Il quarto parametro di MapRoute consente di specificare le restrizioni per i valori. Puoi aggiungere una rotta prima di questa che è per " artisti / {azione} / {id} " con una limitazione dei valori validi per l'azione; non riuscendo ad abbinare una delle tue azioni, passerà al percorso successivo che corrisponderà al nome dell'artista.

Altri suggerimenti

In realtà definiresti più percorsi ... le azioni definite nel tuo controller andrebbero per prime con il valore predefinito in fondo. Mi piace pensare alle definizioni del percorso come a una "grande" istruzione switch ole " dove vince la prima regola ...

routes.MapRoute(
               "ArtistPostComment",
               "artists/PostComment/{id}",
               new { controller = "Artists", action = "PostComment", id = "" }
);
routes.MapRoute(
               "ArtistDeleteComment",
               "artists/DeleteComment/{id}",
               new { controller = "Artists", action = "DeleteComment", id = "" }
);
routes.MapRoute(
               "ArtistDefault",
               "artists/{artistName}",
               new { controller = "Artists", action = "Show", artistName = "" }
);               
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top