1

System.Web.Routing.RouteCollection.MapPageRoute を使用して URL を書き換える webforms プロジェクトがありますが、いくつかの動的 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 と pid = 2 ではなく、id = 2-2 と pid = something という結果になります。

{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 に答える