14 messaggi dal 24 febbraio 2011
Ho creato 2 regole RouteTable

RouteTable.Routes.MapPageRoute("Categorie", "{codiceLingua}/{urlCategoria}/{idCategoria}", "~/Categorie.aspx")
RouteTable.Routes.MapPageRoute("Prodotti", "{codiceLingua}/{idProdotto}/{urlProdotto}", "~/Prodotto.aspx")

Quando genero i link sia categorie che prodotti entra in funzione sempre e solo la prima regola.

Come faccio nei link dei prodotti a dire di utilizzare la seconda regola?

Utilizzo normali a href su codice html

Link prodotto
<a href="<%= configurazione.urlSito.ToString() +"/"+ Lingua.codiceLingua.ToString() %>/<%# eval("idProdotto") %>/<%# Eval("urlProdotto")%>">
<%# Eval("nomeProdotto")%></a>
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

Delta Informatic:

entra in funzione sempre e solo la prima regola.

sì, la prima route catturerà ogni URL in cui siano presenti 3 segmenti qualsiasi separati da slash.

E' importante che almeno uno dei segmenti sia digitato staticamente, in modo che le due routes possano differenziarsi.

Dunque potresti provare con:
RouteTable.Routes.MapPageRoute("Categorie", "{codiceLingua}/Categorie/{idCategoria}", "~/Categorie.aspx")
RouteTable.Routes.MapPageRoute("Prodotti", "{codiceLingua}/Prodotti/{idProdotto}", "~/Prodotto.aspx")
Così la prima verrà scelta solo per URLs contenenti "/Categorie/" e la seconda "/Prodotti/".

Inoltre puoi rendere le routes più rigorose, vincolando {codiceLingua}, {idProdotto} e {idCategoria} ad assumere solo specifici valori.

Ad esempio {codiceLingua}, se ho compreso bene il suo uso, potrebbe valere "it", "en", "fr" o altra lingua supportata dal tuo sito.
{idCategoria}, allo stesso modo, può assumere solo valori numerici.

Il metodo MapPageRoute ha un overload che ti permette di definire dei constraints, il tutto per evitare che queste routes vengano scelte anche quando si forniscono dati non validi.
'codiceLingua può valere una di 3 possibili stringhe e idCategoria deve essere composto solo da cifre
Dim constraints As New RouteValueDictionary From {{"codiceLingua", "it|en|fr"}, {"idCategoria", "\d+"}}
RouteTable.Routes.MapPageRoute("Categorie", "{codiceLingua}/Categorie/{idCategoria}", "~/Categorie.aspx", False, Nothing, constraints)


ciao
Modificato da BrightSoul il 28 marzo 2013 23.25 -

Enjoy learning and just keep making
14 messaggi dal 24 febbraio 2011
Grazie mille della risposta.

Avevo dedotto anch'io in questi giorni di metterci una costante ed infatti funziona. Però poiché il sito sarà multilingua non posso scrivere qualcosa di costante. Si è vero che potrei mettere /CAT/ e /PROD/ così siamo apposto, però ho visto che altri e-commerce non usano questi trucchetti.

Mi sembra impossibile non ci sia un metodo migliore anche perché ogni regola creata ha un suo nome identificativo quindi credevo che si potesse richiamare tale nome dal link in modo da scegliere io la regola giusta senza dover farla scegliere al .net

Anche per il filtro sui parametri ti ringrazio, l'avevo letto in giro. Solo che anche qua c'è il problema che le lingue possono essere installate direttamente dal DB quindi come faccio a mettere un controllo statico tipo {"codiceLingua", "it|en|fr"}
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao, prego!

Delta Informatic ha scritto:

ogni regola creata ha un suo nome identificativo quindi credevo che si potesse richiamare tale nome dal link

Nella pagina puoi usare il metodo GetRouteUrl che, tra i suoi parametri, accetta per l'appunto il nome di una route.
Tuttavia, ciò che GetRouteUrl produce è solo un url, cioè una banale stringa che non contiene alcun "suggerimento" per Asp.net sulla route che dovrà selezionare.

La selezione avviene unicamente confrontando una route alla volta con l'url della richiesta. Se c'è una corrispondenza, la route viene scelta. Sei tu che devi fare in modo che non esistano ambiguità.

Delta Informatic ha scritto:

Avevo dedotto anch'io in questi giorni di metterci una costante ed infatti funziona.

Benissimo, questa è la strada da seguire. Dobbiamo solo fare in modo che le routes vengano create dinamicamente, in base alle lingue supportate dal sito.

Delta Informatic ha scritto:

Solo che anche qua c'è il problema che le lingue possono essere installate direttamente dal DB

Ok, andiamo a prenderle dal DB. Nel global.asax, dentro l'Application_Start metti qualcosa di questo tipo:
'qui interrogo il database per farmi dare le lingue supportate da questo sito
Dim lingueSupportate As Lingua() = database.LingueSupportateDaQuestoSito()
'per ognuna di quelle lingue...
For Each lingua in LingueSupportate

'Leggo la sigla e le traduzioni dei nomi "Categorie" e "Prodotti"
Dim siglaLingua = lingua.Sigla
Dim traduzioneCategorie = lingua.TraduzioneCategorie
Dim traduzioneProdotti = lingua.TraduzioneProdotti

'Uso i valori per comporre dinamicamente le routes
RouteTable.Routes.MapPageRoute("Categorie-" & siglaLingua, siglaLingua & "/" & traduzioneCategorie & "/{idCategoria}", "~/Categorie.aspx")
RouteTable.Routes.MapPageRoute("Prodotti-" & siglaLingua, siglaLingua & "/" &  traduzioneProdotti & "/{idProdotto}", "~/Prodotto.aspx")
Next

Così non hai più bisogno neanche dei constraints dato che ogni lingua ha la sua propria route per Categorie e Prodotti.

ciao
Modificato da BrightSoul il 29 marzo 2013 23.43 -

Enjoy learning and just keep making
14 messaggi dal 24 febbraio 2011
Ora le url routing sono ok.

Grazie mille dei consigli :-)

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.