web-dev-qa-db-ja.com

ASP.NET MVCルートの無限URLパラメーター

ASP.NETコントローラーで無限パラメーターを取得できる実装が必要です。私があなたに例を挙げればそれはより良いでしょう:

私が以下のURLを持っていると仮定しましょう:

example.com/tag/poo/bar/poobar
example.com/tag/poo/bar/poobar/poo2/poo4
example.com/tag/poo/bar/poobar/poo89

ご覧のとおり、example.com/tag/の後に無限のタグが付けられ、ここではスラッシュが区切り文字になります。

コントローラで私はこれをしたいと思います:

foreach(string item in paramaters) { 

    //this is one of the url paramaters
    string poo = item;

}

これを達成するための既知の方法はありますか?コントローラーから値に到達するにはどうすればよいですか? Dictionary<string, string>またはList<string>

注:

質問は十分に説明されていないIMOですが、私はそれに合うように最善を尽くしました。 in。自由に調整してください

38
tugberk

このような:

routes.MapRoute("Name", "tag/{*tags}", new { controller = ..., action = ... });

ActionResult MyAction(string tags) {
    foreach(string tag in tags.Split("/")) {
        ...
    }
}
58
SLaks

キャッチオールは生の文字列を提供します。より洗練された方法でデータを処理したい場合は、常にカスタムルートハンドラーを使用できます。

public class AllPathRouteHandler : MvcRouteHandler
{
    private readonly string key;

    public AllPathRouteHandler(string key)
    {
        this.key = key;
    }

    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var allPaths = requestContext.RouteData.Values[key] as string;
        if (!string.IsNullOrEmpty(allPaths))
        {
            requestContext.RouteData.Values[key] = allPaths.Split('/');
        }
        return base.GetHttpHandler(requestContext);
    }
} 

ルートハンドラーを登録します。

routes.Add(new Route("tag/{*tags}",
        new RouteValueDictionary(
                new
                {
                    controller = "Tag",
                    action = "Index",
                }),
        new AllPathRouteHandler("tags")));

コントローラ内の配列としてタグを取得します。

public ActionResult Index(string[] tags)
{
    // do something with tags
    return View();
}
26
TheCodeKing

それは catch-all と呼ばれます:

tag/{*tags}
12
Anton Gogolev

誰かが.NET 4.0のMVCでこれに来ている場合に備えて、ルートを定義するところに注意する必要があります。私は喜んで_global.asax_に行き、これらの回答(および他のチュートリアル)で提案されているようにルートを追加して、どこにも行きませんでした。私のルートはすべてデフォルトで_{controller}/{action}/{id}_にデフォルト設定されています。 URLにさらにセグメントを追加すると、404エラーが発生しました。次に、App_StartフォルダーにあるRouteConfig.csファイルを見つけました。このファイルは、Application_Start()メソッドの_global.asax_によって呼び出されることがわかりました。したがって、.NET 4.0では、必ずカスタムルートをそこに追加してください。 この記事 はそれを美しくカバーしています。

5
DavidHyogo