Строковое значение передачи маршрута ASP.NET

Я пытаюсь создать страницу на веб-сайте на основе ASP.NET MVC, где одна страница позволяет выбирать по имени пользователя, а не по идентификатору. Я бы подумал, что маршрут должен быть примерно таким:

routes.MapRoute(
  "CustomerView", "Customer/Details/{username}",
  new { username = "" }
);

routes.MapRoute(
  "Default", "{controller}/{action}/{id}",
  new { controller = "Home", action = "Index", id = "0" }
);

но всякий раз, когда я использую HTML.Actionlink, я получаю http://mysite.com/Customer/Details?username=valuehere. Я рассматривал общий маршрут, например:

routes.MapRoute(
  "CustomerView", "Customer/Details/{username}",
  new { controller="Customer", action = "Details", username = "" }
);

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


person nathanchere    schedule 25.01.2010    source источник


Ответы (3)


Я не уверен, что полностью понимаю вопрос ... вы говорите, что хотите:

  1. один маршрут {controller}/{action}/{username}, который обрабатывает URL-адреса, в которых третий токен является строкой, соответствующие действия, в которых есть строка аргумента «имя пользователя», и

  2. другой маршрут {controller}/{action}/{id}, который обрабатывает URL-адреса, в которых третий токен является целым числом, соответствующие действиям, в которых есть целочисленный аргумент «id»?

Если это так, проверьте перегрузку для MapRoute, которая требует 4-й аргумент, определяющий ограничения маршрута. Это должно позволить вам сделать что-то вроде этого:

routes.MapRoute(
    "CustomerView", "{controller}/{action}/{username}",
    new { controller="Customer", action = "Details", username = "" }
    new { username = @"[^0-9]+" }
);

Это (непроверенное) ограничение должно привести к тому, что маршрут {username} будет соответствовать чему-либо, где 3-й токен содержит хотя бы один нецифровой символ.

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

person Seth Petry-Johnson    schedule 25.01.2010
comment
Хотя я уже разработал, как решить мою конкретную проблему, ваше объяснение того, как отображаются маршруты, было достаточно полезным, поэтому я все равно отмечаю его как ответ. - person nathanchere; 28.01.2010

Имеет ли метод Details вашего контроллера Customer параметр "username" вместо параметра id?

Если параметры не совпадают, они добавляются как переменные строки запроса.

person womp    schedule 25.01.2010
comment
У него есть параметр имени пользователя. - person nathanchere; 25.01.2010

Это работает:

routes.MapRoute(
  "CustomerView", "Customer/Details/{username}",
  new { controller="Customer", action = "Details", username = "" }
);

но в приведенном выше вопросе я имел в виду ошибку, которую я допустил во втором примере:

routes.MapRoute(
  "CustomerView", "{controller}/{action}/{username}",
  new { controller="Customer", action = "Details", username = "" }
);

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

person nathanchere    schedule 25.01.2010