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。自由に調整してください
このような:
routes.MapRoute("Name", "tag/{*tags}", new { controller = ..., action = ... });
ActionResult MyAction(string tags) {
foreach(string tag in tags.Split("/")) {
...
}
}
キャッチオールは生の文字列を提供します。より洗練された方法でデータを処理したい場合は、常にカスタムルートハンドラーを使用できます。
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();
}
それは catch-all と呼ばれます:
tag/{*tags}
誰かが.NET 4.0のMVCでこれに来ている場合に備えて、ルートを定義するところに注意する必要があります。私は喜んで_global.asax
_に行き、これらの回答(および他のチュートリアル)で提案されているようにルートを追加して、どこにも行きませんでした。私のルートはすべてデフォルトで_{controller}/{action}/{id}
_にデフォルト設定されています。 URLにさらにセグメントを追加すると、404エラーが発生しました。次に、App_StartフォルダーにあるRouteConfig.csファイルを見つけました。このファイルは、Application_Start()
メソッドの_global.asax
_によって呼び出されることがわかりました。したがって、.NET 4.0では、必ずカスタムルートをそこに追加してください。 この記事 はそれを美しくカバーしています。