Как мне написать маршрут, который позволяет подчеркивания в ASP.NET MVC? - PullRequest
1 голос
/ 21 января 2011

Я получил следующую проблему на экзамене MCTS.В книге говорится, что ответ C, но я подумал, что B будет правильным ответом.Почему это C?

Вы создаете новое веб-приложение ASP.NET MVC 2.Следующие маршруты по умолчанию создаются в файле Global.asax.cs.(Номера строк включены только для справки.)

01 public static void RegisterRoutes(RouteCollection routes)
02 {
03 routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
04
05 routes.MapRoute( "Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" } );
06 }

Вы реализуете контроллер с именем HomeController, который включает методы со следующими сигнатурами.

public ActionResult Index() 
public ActionResult Details(int id) 
public ActionResult DetailsByUsername(string username) 

Вам необходимо добавить маршрут для удовлетворения следующих требований:

  • Сведения о пользователе должны отображаться при вводе имени пользователя в качествепуть, вызывая действие DetailsByUsername.

  • Имена пользователей могут содержать буквенно-цифровые символы и символы подчеркивания и могут содержать от 3 до 20 символов.Что делать?

A.Замените строку 05 следующим сегментом кода.

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

B.Замените строку 05 следующим сегментом кода.

routes.MapRoute( "Default", "{controller}/{action}/{username}", new { controller = "Home", action = "DetailsByUsername", username = "" }, new { username = @"\w{3,20}" } );

C.В строке 04 добавьте следующий сегмент кода.

routes.MapRoute( "Details by Username", "{username}", new { controller = "Home", action = "DetailsByUsername" }, new { username = @"\w{3,20}" } );

D.В строке 04 добавьте следующий сегмент кода.

routes.MapRoute( "Details by Username", "{id}", new { controller = "Home", action = "DetailsByUsername" }, new { id = @"\w{3,20}" } );

Ответы [ 3 ]

4 голосов
/ 21 января 2011

Когда маршрут ASP.NET MVC ищет действие для сопоставления, он принимает во внимание несколько вещей:

  1. Имя действия (без учета регистра)
  2. имена параметров (без учета регистра)
  3. Соответствуют ли ограничения на маршруте.

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

routes.MapRoute( 
    "Details by Username", 
    "{username}", 
    new { controller = "Home", action = "DetailsByUsername" }, 
    new { username = @"\w{3,20}" } 
);

URL с такой структурой будет соответствовать этомуМаршрут по следующим причинам:

http://example.com/my_user_name
  1. Имя действия совпадает,
  2. Он ищет параметр в действии с именем 'username' и
  3. критерии для не алфавитно-цифровых символов удовлетворяются.

C - правильный ответ, поскольку он добавляет к текущим маршрутам.

Ответ B заменяет существующее определение маршрута, тем самым предотвращая маршрутизацию по умолчанию к действию Home controller Index.

2 голосов
/ 21 января 2011

C прав.

Для B, если вы замените строку 05, все остальные ваши маршруты не будут работать. Вам также необходимо вставить строку 04, потому что в противном случае маршрут линии 05 поймает ее еще до того, как у нее появится шанс.

1 голос
/ 21 января 2011

Замена маршрута приведет к тому, что Details не будет работать, поскольку идентификатор больше не отображается.

C является правильным

...