1

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

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

这个 MapPageRoute 看起来像这样

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

但我意识到有些 URL 可能看起来像这样

/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}。我有几条通往特定文件夹的类似路线,所以据我所知,我不能使用全部捕获。但是我该如何解决这个问题?

4

1 回答 1

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 }
            );
        }
    }
}
于 2013-01-09T23:47:12.200 回答