4

名前空間を調べたり、制約をいじったりしてきましたがSystem.Web.Routing、これを実装する方法がわかりません。

WebPages/Razor フレームワークを使用して、ASP.NET Web サイト (非 WAP、非 MVC )に取り組んでいます。

親が一致する場合にのみ試行される子ルートをルートに含めることができる「ネストされたルーティング」の形式を実装しようとしています。各子は URI の「残り」との照合を試みます。必要に応じて、「深さ優先」のルート一致検索。

routes.Add(new ParentRoute("{foo}/{*remainder}", new[] {
    new ParentRoute("{bar}/{*remainder}", new[] {
        new Route("{baz}"),
        new Route("{zip}"),
    }),
    new ParentRoute("{qux}/{*remainder}", new[] {
        new Route("{baz}"),
        new Route("{zip}"),
    }),
));

簡潔にするために、必要な制約/ハンドラー (他のパラメーターの中でも) を除外しました。

いずれにせよ、ツリーを下っていく各ステップ{*remainder}は URI の末尾に一致します。ブランチが失敗すると、次のブランチに移動し、基本的に次のようなテストを行います。

foo
  foo/bar
    foo/bar/baz
    foo/bar/zip
  foo/qux
    foo/qux/baz
    foo/qux/zip

さて、私は確かに「コードを書いてください」と言っているのではなく、正しい方向へのジェスチャーです。

このような機能の実装を開始するには、API のどこを見ればよいでしょうか? ルートや制約などの記述に関する無数のチュートリアルや情報を見つけることができますが、ルーティング エンジンの拡張に関する情報はありません。


補遺
令状として追加し続けます

  1. このような「ルーティング ツリー」からの URL 生成が複雑になることは承知しています。それは私が実装するつもりのものではありません。

  2. 一種の反復的なルート生成で十分であることに気付きました。だから私はそれを可能な答えとしてすぐに投稿すると思います。いいえ、そうではありません。エッジケースが多すぎます。

4

1 に答える 1

1

私は次のコードを持っていますが、それをどのように処理したいのかわからない点が 1 つあります: 最大でいくつの子がルートを持つことができるか知っていますか?

Global.asax で:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.Add(new Route("test/{path}", new RouteValueDictionary { { "path", string.Empty } }, new TestingRouteHandler()));
    }

TestingRoutHandler クラス:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Routing;
using System.Web;
using System.Web.UI;
using System.Web.Compilation;

namespace WebApplication1
{
    class TestingRouteHandler : IRouteHandler
    {
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            //This is where you should treat the request, test if the file exists and if not, use the parent part of the url
            string aspxFileName = string.Format("~/{0}.aspx", requestContext.HttpContext.Request.Url.PathAndQuery.Replace("/", string.Empty));

            return (IHttpHandler)BuildManager.CreateInstanceFromVirtualPath(aspxFileName, typeof(Page)) as Page;
        }
    }
}
于 2012-12-20T20:57:27.920 に答える