12

次のようなルーティング マップを定義するにはどうすればよいでしょうか。

{TreePath}/{Action}{Id} 

TreeMap は、次のようにデータベースから動的にロードされます。

 'Gallery/GalleryA/SubGalleryA/View/3'
4

4 に答える 4

13

これを行うためのカスタム ルート ハンドラを作成できます。実際のルートはキャッチオールです。

routes.MapRoute(
    "Tree",
    "Tree/{*path}",
    new { controller = "Tree", action = "Index" })
        .RouteHandler = new TreeRouteHandler();

ツリー ハンドラーはパスを見て、最後の部分をアクションとして抽出し、コントローラーにリダイレクトします。アクション部分もパスから削除されます。{id} 部分の追加は簡単です。

public class TreeRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string path = requestContext.RouteData.Values["path"] as string;

        if (path != null)
        {
            int idx = path.LastIndexOf('/');
            if (idx >= 0)
            {
                string actionName = path.Substring(idx+1);
                if (actionName.Length > 0)
                {
                    requestContext.RouteData.Values["action"] = actionName;
                    requestContext.RouteData.Values["path"] = 
                        path.Substring(0, idx);
                }
            }
        }

        return new MvcHandler(requestContext);
    }
}

コントローラーは、期待どおりに動作します。

public class TreeController : Controller
{
    public ActionResult DoStuff(string path)
    {
        ViewData["path"] = path;
        return View("Index");
    }
}

のように URL を呼び出せるようになり/Tree/Node1/Node2/Node3/DoStuffました。アクションが取得するパスはNode1/Node2/Node3

于 2009-06-21T10:20:31.313 に答える
2

URLを入れ替えることはできますか?{TreePath} パラメータを最後のパラメータにすることができれば、これを 1 つのルートで簡単に実行できます。

   routes.MapRoute("TreeRoute", 
                    "{Action}/{id}/{*TreePath}", 
                    new TreeRouteHandler()));

ただし、ワイルドカード キャッチオール パラメーターは最後のパラメーターでなければなりません。

そうしないと、TreeMap URL の可能な各セクションに 1 つずつ、複数のパラメーターを定義しなければならなくなると思います。

間にリテラル テキストがなければ、2 つのルーティング パラメータを一緒に定義することはできないことに注意してください。つまり、 を定義することはできますが、決して定義する{Action}/{Id}ことはできません。ルーティング エンジンは、パターン マッチング時に、1 つのパラメーターがどこで終了し、次のパラメーターが開始するかを知る方法はありません。{Action}{Id}

于 2009-06-21T05:29:26.657 に答える
2

クエリ文字列内に「貪欲な」部分を含めることができますが、その後に固定部分を含めることができます。

/{*TreePath}/Edit/{id}
/{*TreePath}/Action/{id}

貪欲な部分は何らかのリテラル値 (スラッシュ以外) で停止する必要があるため、上記のルートではアクションは可変ではないことに注意してください。「ツリー」でいくつかのアクションを実行するだけの場合は機能しますが、多くのアクションがある場合は、それぞれに独自のルート エントリが必要になるため、面倒です。

そのままでは機能しませんが、カスタム ルートが必要です。ここでコードを含む件名に関する素敵な書き込みを見つけることができます

于 2009-12-16T15:39:26.927 に答える
1

私は MVC を初めて使用しますが、要件の 1 つはこのオプションでした。私はVB-ERなので、コードの変換に問題がありましたが、サンプルソリューションに貢献したいと思っていまし .コードとビンは外に出ますが、標準プロジェクトからコピーできます。

o、インデックスには app/bla/bla/bla タグを、注文ページには app/trade/order/view タグを使用する必要があります。

于 2009-10-16T00:53:17.513 に答える