2013-04-09 3 views
9

Если я перейти к следующему StackOverflow URL http://stackoverflow.com/questions/15532493 он автоматически добавляется в названии вопроса, как так:Stackoverflow стиль URL (настройка исходящего URL)

http://stackoverflow.com/questions/15532493/mvc-custom-route-gives-404

То есть, я могу напечатать в URL в мой браузер без название вопроса и оно добавляется автоматически.

Как я могу добиться того же результата в своем приложении? (Примечание: я знаю, что заголовок вопроса не влияет на отображаемую страницу).

У меня есть контроллер под названием Users с методом действия, который называется Details. У меня есть следующий маршрут:

routes.MapRoute("UserRoute", 
    "Users/{*domain}", 
    new { controller = "User", action = "Details" }, 
    new { action = "^Details$" }); 

Поскольку это приложение интрасети, пользователь аутентифицирован против своей учетной записи Windows. Я хочу добавить домен и имя пользователя в URL.

Если я генерировать URL в представлении следующим образом:

@Html.ActionLink("Model.UserName", "Details", "User", new { domain = Model.Identity.Replace("\\", "/") }) 

Я получаю URL, который выглядит примерно так:

домена/Пользователи/ACME/JSmith

Однако, если пользователь переходит к URL-адресу Domain/Users/ с помощью навигационной панели браузеров, он соответствует маршруту, и пользователь переходит на страницу сведений о пользователе. Я хотел бы добавить ACME/jsmith/ на URL в этом случае.

Исследование я сделал до сих пор указывает на то, я мог бы реализовать пользовательский объект маршрута, выводя из RouteBase и реализации GetRouteData и GetVirtualPath методы, но я не знаю, с чего начать это (documentaiton MSDN очень тонкая) ,

Так что я хотел бы знать:

  1. Есть ли способ достижения этой цели без реализации пользовательского маршрута?
  2. Если нет, знает ли кто-нибудь о каких-либо хороших ресурсах, чтобы заставить меня начать реализацию пользовательского маршрута?
  3. Если требуется выполнение пользовательского маршрута, как он получает информацию, которая предположительно должна быть загружена из базы данных? Хорошо ли, чтобы служба вызывала вызовы базы данных в маршруте (что кажется мне неправильным) или может ли информация передаваться на трассу с помощью структуры MVC?
+1

http://stackoverflow.com/questions/25259/how-does-stackoverflow-generate-its-seo-friendly-urls –

+2

@ Soner Gönül - связанный вопрос показывает «как-генерировать строки-подобные-это», что я не прошу. Я хочу добавить значения в url, если пользователь вводит только бит «Domain/Users /» в панели навигации браузеров. –

+1

Это не дубликат, так как он не спрашивает, КАК генерировать строку заголовка, но вместо этого как всегда перенаправлять страницу, где заголовок находится в URL-адресе, даже если пользователь добрался туда, просто введя идентификатор – tucaz

ответ

2

Это на самом деле довольно просто. Поскольку название есть только для SEO-причин, вам не нужно отвечать на фактический вопрос, поэтому Контроллер Вопроса (в случае SO) загрузит правильный вопрос на основе идентификатора (в URL-адресе) и перенаправляет пользователя с помощью 301 код состояния.

Вы можете увидеть это поведение с любым веб-инспектора

enter image description here

+0

. Спасибо, это что я собирался попробовать изначально, но это не было правильно; Думаю, я должен научиться доверять своим инстинктам. Я проведу позже, чтобы узнать, смогу ли я это сделать. Правильно ли я думаю, что это означает, что база данных будет удалена 2 раза? –

+0

Да, но SO, вероятно, имеет какое-то кэширование или optmization, чтобы они могли переводить идентификаторы в заголовки вопросов и не ударять базу данных дважды с полной загрузкой. – tucaz

+0

Работает отлично. Большое спасибо. Мне немного неудобно с двойным попаданием в базу данных, но я просто вытаскиваю небольшое количество информации, и я не ожидаю, что где-нибудь рядом с трафиком Stackoverflow, поэтому я перейду через этот мост и реализую политику кэширования, если это становится проблемой. –

1

Вы могли бы сделать это на стороне клиента с помощью Javascript:

history.pushState({}, /* Title Here */, /* URL Here */); 

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