Проблема маршрутизации с - в переменной - PullRequest
0 голосов
/ 25 августа 2010

У меня на сайте asp.net mvc 2 есть маршрут, который выглядит так

routes.MapRoute(
                "media_display",
                "Media/{mediaId}-{mediaName}",
                new { controller = "Media", action = "Display" },
                new { mediaId = @"\d+" }
            );

Где mediaId - это идентификатор, а mediaName - это название носителя. Пример

www.example.com / Медиа / 1-тест-медиа-лист

Если идентификатор равен 1, а имя - «список тестовых файлов», проблема в том, что я заменяю пробел «» на -, и это разрушает мой маршрут.

Я просто не могу понять, как сделать так, чтобы «mediaName» могло содержать -.

У меня также есть следующий рут, но решение должно быть таким же.

routes.MapRoute(
                "media_display",
                "Media/{mediaId}-{mediaName}/edit",
                new { controller = "Media", action = "Edit" },
                new { mediaId = @"\d+" }
            );

Также возможно ли создать маршрут, который будет охватывать все следующие 3 теста, сейчас у меня есть только 3 различных маршрута, но я бы хотел сократить это.

www.example.com / Медиа / 1-тест-медиа-лист

www.example.com / Медиа / 1

www.example.com / Медиа / 1

Ответы [ 2 ]

1 голос
/ 25 августа 2010

Я считаю, что более элегантное и простое решение имеет www.example.com/Media/1/test-media-list.

Если вы настаиваете на своих примерах url, создайте маршрут, подобный следующему:

routes.MapRoute(
                "media_display",
                "Media/{slug}",
                new { controller = "Media", action = "Display" },
            );

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

0 голосов
/ 25 августа 2010

Я сделал это с помощью регулярного выражения, которое нашел в http://iridescence.no/post/Defining-Routes-using-Regular-Expressions-in-ASPNET-MVC.aspx

routes.Add(
    new RegexRoute(@"^Media\/(?<mediaId>\d+)-(?<mediaName>[^\/]*)$", 
        new MvcRouteHandler())
    {
        Defaults = new RouteValueDictionary(new { 
        controller = "Media", action = "Display", playlistName = "" })
    }
...