MapPageRoute中的通配符

时间:2013-01-09 19:37:36

标签: c# asp.net url-rewriting routing webforms

我有一个webforms项目,我使用System.Web.Routing.RouteCollection.MapPageRoute来重写URL,但是我遇到了一些动态URL的问题。我的网址可能如下所示;

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

,MapPageRoute就是这个

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

但我已经意识到某些网址可能看起来像这样

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

并且我的路由选择不正确 - 第一个例子最终会得到结果id = 2-2和pid = something而不是id = 2和pid = 2.

{title}并不重要 - 仅使用{id}和{pid}。我有几个类似的路由到特定的文件夹,所以我可以se我不能使用catch all。但是我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:1)

下面的简单RouteConfig包含一个与您需要的匹配的TestRoute。仅此而已,所以它在某种意义上是非常糟糕的代码。

但我们的想法是,现在可以使用正则表达式,它可以很容易地满足您的需求。 (命名组“id”(?<id>\d)和“pid”(?<pid>\d)仅匹配数字(\d)为什么它们只匹配到下一个破折号。)

希望它能带来一些灵感。

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 }
            );
        }
    }
}