Подтвердить что ты не робот

Бесконечные параметры URL для маршрута MVC ASP.NET

Мне нужна реализация, где я могу получить бесконечные параметры на моем 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>?

ПРИМЕЧАНИЕ.

Вопрос не очень хорошо объяснен ИМО, но я старался изо всех сил подходить к нему. в. Не стесняйтесь настраивать его

4b9b3361

Ответ 1

Вот так:

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

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

Ответ 2

Уловка все даст вам необработанную строку. Если вы хотите более элегантный способ обработки данных, вы всегда можете использовать собственный обработчик маршрута.

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();
}

Ответ 3

Это называется catch-all:

tag/{*tags}

Ответ 4

На всякий случай, когда кто-то приходит к этому с MVC в .NET 4.0, вам нужно быть осторожным , где вы определяете свои маршруты. Я с радостью ходил в global.asax и добавлял маршруты, как предлагалось в этих ответах (и в других учебниках), и никуда не денутся. В моих маршрутах все по умолчанию были {controller}/{action}/{id}. Добавление дополнительных сегментов в URL-адрес дало мне ошибку 404. Затем я обнаружил файл RouteConfig.cs в папке App_Start. Оказывается, этот файл вызывается global.asax в методе Application_Start(). Итак, в .NET 4.0 убедитесь, что вы добавили туда свои настраиваемые маршруты. Эта статья прекрасно описывает ее.