Как добавить «текстовый ярлык» к URL-адресу страницы в MVC3?

Посмотрите, что делает StackOverflow:

http://stackoverflow.com/questions/8933768/c-sharp-boolean-outside-method-wont-read

URL-адрес работает без финального декоратора, который в основном используется для целей SEO.

Я хочу что-то подобное в моем приложении ASP.Net MVC3.

Предполагая, что в таблице Article есть поле Slug nvarchar(1024) not null, как мне вытолкнуть его из механизма маршрутизации, чтобы оно отображалось, когда кто-то посещает ссылку?

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

Четкий и короткий пример был бы феноменальным.


person Only Bolivian Here    schedule 19.01.2012    source источник
comment
кажется, nvarchar(2083) - лучший тип столбца для URL-адреса из здесь   -  person Shaiju T    schedule 28.07.2015


Ответы (3)


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

routes.MapRoute(
    "article"
    "articles/{id}/{slug}",
    new { controller = "Article", action = "Index", slug = "" }
);

И соответствующее действие:

public ActionResult Index(int id, string slug) {
    var article = _repository.GetById<Article>(id);

    ......

    return View();
}

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

person Nathan Taylor    schedule 19.01.2012
comment
Это чистый, простой код. Спасибо за обмен и дополнительные предложения по перенаправлению. :) - person Only Bolivian Here; 20.01.2012
comment
еще одна причина, по которой я ненавижу 5-минутный льготный период редактирования ответов, когда вы изначально писали, в вашем сообщении ничего не упоминалось о влиянии на SEO или перенаправлении до тех пор, пока я не опубликовал свой ответ. - person Anthony Shaw; 20.01.2012
comment
Извините за @AnthonyShaw, это было запоздалой мыслью, и я действительно увидел ваше связанное содержание ответа после редактирования моего исходного ответа. Проголосуйте за. :) - person Nathan Taylor; 20.01.2012
comment
привет, я предоставил недопустимый ярлык для этого сообщения, например http://stackoverflow.com/questions/8933860/34how-trto-a34dd-a-tertrxt-slug-to-a343-page-ur33l-in-mvc3, и да, stackoverflow перенаправляет на исправление сообщения. - person Shaiju T; 28.07.2015

routes.MapRoute("Slugged", "{controller}/{action}/{id}/{slug}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });'

Затем для действия, обрабатывающего ваш вызов, примите параметр id и slug.

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

person Anthony Shaw    schedule 19.01.2012

сначала объявите параметр маршрутизации "slug", затем передайте его через значения маршрута при определении ссылки действия или URL-адреса действия.

person STO    schedule 19.01.2012