2013-01-09 6 views
1

J'ai un projet webforms dans lequel j'utilise System.Web.Routing.RouteCollection.MapPageRoute pour réécrire des URL mais j'ai un problème avec quelques URLs dynamiques. Mon URL pourrait ressembler à ceci;Caractère générique dans MapPageRoute

/folder/city-1-2-something.aspx 

et MapPageRoute pour cela ressemble à ce

routeCollection.MapPageRoute("CompanyCity", "folder/city-{id}-{pid}-{title}.aspx", "~/mypage.aspx"); 

Mais je me suis rendu compte que certaines URL pourraient ressembler à ceci

/folder/city-2-2-something-something.aspx 
/folder/city-2-2-something-something-something.aspx 
/folder/city-2-2-something-something-something-something.aspx 

et ceux-ci ne sont pas Cought correctement par mon routage - le premier exemple se terminera par les résultats id = 2-2 et pid = quelque chose au lieu de id = 2 et pid = 2.

Le {title} n'est pas important - seuls {id} et {pid} sont utilisés. J'ai plusieurs routes similaires à des dossiers spécifiques, donc pour autant que je peux, je ne peux pas utiliser un tout attraper. Mais comment puis-je résoudre ce problème?

Répondre

1

Le RouteConfig simple ci-dessous contient un TestRoute qui correspond exactement à ce dont vous avez besoin. Et rien de plus, c'est donc dans un sens assez mauvais code.

Mais l'idée est qu'il est maintenant possible d'utiliser des expressions régulières qui peuvent facilement répondre à vos besoins. (Les groupes nommés « id » (?<id>\d) et « pid » (?<pid>\d) correspond uniquement à chiffres (\d) pourquoi ils ne correspondent que dash prochain.)

L'espoir peut être une source d'inspiration.

using System.Text.RegularExpressions; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing; 

namespace InfosoftConnectSandbox 
{ 
    public class RouteConfig 
    { 
     class TestRoute : RouteBase 
     { 
      Regex re = new Regex(@"folder/city-(?<pid>\d)-(?<id>\d)-.*"); 

      public override RouteData GetRouteData(HttpContextBase httpContext) 
      { 
       var data = new RouteData(); 

       var url = httpContext.Request.Url.ToString(); 

       if (!re.IsMatch(url)) 
       { 
        return null; 
       } 

       foreach (Match m in re.Matches(url)) 
       { 
        data.Values["pid"] = m.Groups["pid"].Value; 
        data.Values["id"] = m.Groups["id"].Value; 
       } 

       data.RouteHandler = new PageRouteHandler("~/mypage.aspx"); 

       return data; 
      } 

      public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
      { 
       return new VirtualPathData(this, "~/mypage.aspx"); 
      } 
     } 

     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.Add(new TestRoute()); 

      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 
     } 
    } 
} 
Questions connexes