ASP.NET маршрут, передающий строковое значение - PullRequest
0 голосов
/ 25 января 2010

Я пытаюсь создать страницу на веб-сайте 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 = "" }
);

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

Ответы [ 3 ]

2 голосов
/ 25 января 2010

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

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

1 голос
/ 25 января 2010

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

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

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

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

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

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

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

1 голос
/ 25 января 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 = "" }
);

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

...