Roteamento ASP.NET: Como fazer o routeConfig manipular uma estrutura de URL mais dinâmica
Meu cenário é o seguinte: um local de eventos pode fazer parte de várias categorias e os usuários também podem adicionar filtros em vários tipos de categorias. Portanto, meus URLs agora são como:
/venues/beaches/boats/themeparks
(isso exibirá todos os locais que são praias, barcos e parques temáticos)/venues/beaches/boats
/venues
etc.Portanto, o número de diferentes tipos de locais (praias, barcos, parques temáticos etc.) é dinâmico e opcional. Decidi usar o URLRouting para começar a obter os diferentes valores no código por meio deRequest.GetFriendlyUrlSegments()
Eu instaleihttps://www.nuget.org/packages/Microsoft.AspNet.FriendlyUrls.Core/ e criou manualmente umRouteConfig.vb
arquivo emApp_Start
pasta. Este arquivo contém:
Public NotInheritable Class RouteConfig
Private Sub New()
End Sub
Public Shared Sub RegisterRoutes(routes As RouteCollection)
Dim settings = New FriendlyUrlSettings()
settings.AutoRedirectMode = RedirectMode.Permanent
routes.EnableFriendlyUrls(settings)
routes.MapPageRoute("", "venues", "~/venues.aspx")
End Sub
End Class
E emglobal.aspx.vb
Eu adicionei:
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
RouteConfig.RegisterRoutes(RouteTable.Routes)
End Sub
Eu removi TODAS as regras de reescrita do meu aplicativo, portanto, nenhuma regra emweb.config
ourewriteRules.config
. Quando vou ao URL:www.example.com/venues
, ele me redireciona corretamente para venues.aspx. Mas este URL:www.example.com/venues/boats/outside/castles/barns/restaurants
, lança um erro 404:
Eu também verifiqueiaqui e tentei isso, habilitando o redirecionamento http no Windows e alterando o web.config:
web.config
<!-- tried setting mode to On/Off/Custom -->
<customErrors mode="Off" defaultRedirect="/error/1" redirectMode="ResponseRedirect">
<error statusCode="404" redirect="/404.aspx" />
</customErrors>
<modules runAllManagedModulesForAllRequests="true">
<add type="aspnetforum.ForumSEOHttpModule, aspnetforum" name="ForumSEOHttpModule" />
<remove name="UrlRoutingModule"/>
<add name="UrlRoutingModule"
type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</modules>
<handlers>
<remove name="PHP55_via_FastCGI" />
<remove name="PHP53_via_FastCGI" />
<add name="ScriptCombiner" verb="POST,GET" path="ScriptCombiner.axd" preCondition="integratedMode" type="ScriptCombiner, App_Code" />
<add name="UrlRoutingHandler"
preCondition="integratedMode"
verb="*"
path="UrlRouting.axd"
type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</handlers>
Descobri que quando defino explicitamente as rotas emRouteConfig.vb
, funciona, assim:
routes.MapPageRoute("", "venues", "~/venues.aspx")
routes.MapPageRoute("", "venues/boats/outside/castles/barns/restaurants", "~/venues.aspx")
Agora URL/venues
e/venues/boats/outside/castles/barns/restaurants
trabalho, mas isso não é dinâmico. Como existem muitas categorias e combinações de locais, não quero adicionar todas essas combinações manualmente. Eu só quero corresponder em todos os URLs que começam com/venues
e depois use o métodoRequest.GetFriendlyUrlSegments
novenues.aspx.vb
para obter as categorias do local.
Como posso fazer isso?