Параметры бесконечного URL для ASP.NET MVC Route

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

5 ответов

Решение

Как это:

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

Это называется всеобъемлющим:

tag/{*tags}

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

в ядре asp .net вы можете использовать *, например, в маршрутизации

[HTTPGet({*id})]

этот код может быть многопараметрическим или при использовании строки отправки с косой чертой использовать их для получения всех параметров

Другие вопросы по тегам