Параметры бесконечного URL для ASP.NET MVC Route - PullRequest
38 голосов
/ 22 сентября 2011

Мне нужна реализация, где я могу получить бесконечные параметры на моем контроллере ASP.NET.Будет лучше, если я приведу вам пример:

Давайте предположим, что у меня будут следующие URL:

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

Как вы можете видеть, после * 1006 будет получено бесконечное количество тегов* и слеш здесь будет разделителем.

На контроллере я хотел бы сделать следующее:

foreach(string item in paramaters) { 

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

}

Есть ли какой-нибудь известный способ добиться этого?Как я могу получить значения от контроллера?С Dictionary<string, string> или List<string>?

ПРИМЕЧАНИЕ:

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

Ответы [ 4 ]

58 голосов
/ 22 сентября 2011

Как это:

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

ActionResult MyAction(string tags) {
    foreach(string tag in tags.Split("/")) {
        ...
    }
}
26 голосов
/ 22 сентября 2011

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

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();
}
11 голосов
/ 22 сентября 2011

Это называется универсальный :

tag/{*tags}
5 голосов
/ 12 февраля 2013

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

...