70 messaggi dal 12 settembre 2010
Ciao a tutti,
avrei la necessità di gestire il routing di un "Area" (chiamiamola ad esempio "Admin") dove in presenza di determinati "slug" vorrei dirottare tutte le richieste verso un controller principale.

Ad esempio mettiamo di avere url di questo tipo:
- www.miosito.com/admin/{slug}
- www.miosito.com/admin/{slug}/pagina1
- www.miosito.com/admin/{slug}/pagina1/pagina
etc...

Vorrei fare in modo che tutte le url di questo tipo vengano controllate da un unico controller e le sue rispettive Action.

Ho già realizzato una regola di routing con una constraint applicata e funziona perfettamente (cioè tutte le richieste che passano per quella regola vengono indirizzate verso un preciso controller...ma in questo caso non c'è un "Area").

Purtroppo ricevo sempre errore 404.

La regola di routing che ho scritto al momento è la seguente:
routes.MapRoute(
                    name: "contentTest",
                    template: "{*slug}",
                    defaults: new { area = "Admin", controller = "Test", action = "Index" },
                    constraints: new { slug = new SlugTestRouteConstraint(() => app.ApplicationServices.CreateScope().ServiceProvider.GetRequiredService<DbContext>()) }
                );


La constraint si occupa semplicemente di verificare se lo {slug} esiste o meno restituendo quindi vero o falso.

Ed il controller banalmente è questo:
[Area("Admin")]
    public class TestController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }



Spero che qualcuno possa aiutarmi.

Vi ringrazio in anticipo.

Saluti.
11.448 messaggi dal 09 febbraio 2002
Contributi
Ciao,
prova con una route del genere e mettila subito sopra a quella di default, così che sia maggiormente prioritaria.
routes.MapRoute(
  name: "Admin", 
  template: "/Admin/{slug}/{*pagina}",
  defaults: new { area = "Admin", controller = "Test", action = "Index" },
  constraints: new { slug = new SlugTestRouteConstraint() }
);


Il token {slug} l'ho tenuto separato dal token catch-all {*pagina}, perché credo che così il route template sia più vicino ai tuoi esempi:
www.miosito.com/admin/{slug}
www.miosito.com/admin/{slug}/pagina1
www.miosito.com/admin/{slug}/pagina1/pagina

Dalla action puoi ottenere il valore dello slug così:
string slug = (string) RouteData.Values["slug"];

E il valore di tutto quel che viene dopo, così:
string slug = (string) RouteData.Values["pagina"];


Così fatto, il route template potrà indirizzare le richieste sempre e soltanto verso l'action Index del TestController nell'area Admin. Tu però hai chiesto:

un unico controller e le sue rispettive Action.

Quindi mi sembra di capire che tu voglia far gestire le richieste a molteplici action dello stesso controller. Con che criterio vuoi selezionare l'action? In base allo slug?

ciao,
Moreno

Enjoy learning and just keep making
70 messaggi dal 12 settembre 2010
Ciao Moreno,
la action dovrebbe essere richiamata proprio tramite il secondo token {*pagina} se fosse possibile.

Grazie mille,
Alessio.
11.448 messaggi dal 09 febbraio 2002
Contributi
Ok Alessio, allora prova così:
routes.MapRoute(
                    name: "Admin", 
                    template: "/Admin/{slug}/{action=Index}",
                    defaults: new { area = "Admin", controller = "Test" },
                     constraints: new { slug = new SlugTestRouteConstraint() }
                    );


Nel caso l'URL sia www.miosito.com/admin/slug/pagina1, allora verrà invocata l'action Pagina1 del TestController.
Ma nel caso di www.miosito.com/admin/{slug}/pagina1/pagina avrai un 404... Come vuoi che sia ricondotto il frammento "pagina1/pagina" al nome di una action?

ciao,
Moreno
Modificato da BrightSoul il 22 marzo 2019 22:22 -

Enjoy learning and just keep making
70 messaggi dal 12 settembre 2010
Ok credo che forse fermarmi alla url del tipo:
www.miosito.com/admin/{slug}/pagina1
possa bastare in questo momento (quindi senza scendere ulteriormente in profondità).
Faccio una prova entro domani e ti saprò dire.

Intanto grazie :)
11.448 messaggi dal 09 febbraio 2002
Contributi
Prego! Fammi sapere come va.

Enjoy learning and just keep making
70 messaggi dal 12 settembre 2010
Ciao Moreno,
ho provato la soluzione che mi hai proposto...che dire ottimo!!! Svolge egregiamente quello che serve a me :)

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.