Пользовательские URL-адреса в приложении ASP.NET MVC5

Я создаю приложение ASP.NET MVC. В настоящее время мои ссылки выглядят так:

/Campaign/Overview/996e19da-c5e6-e511-948f-005056822904

/Service/Offer/767619da-c5e6-e511-948f-005056e529a5

Хотелось бы, чтобы они выглядели так:

/Campaign/Overview/996e19da-c5e6-e511-948f-005056822904/campain-user-friendly-text-taken-from-the-db

/Service/Offer/767619da-c5e6-e511-948f-005056e529a5/service-user-friendly-text-taken-from-the-db

  1. Это означает, что при доступе к /Campaign/Overview/996e19da-c5e6-e511-948f-005056822904/ вы должны получить 301 и будете перенаправлены на /Campaign/Overview/996e19da-c5e6-e511-948f-005056822904/campain-user-friendly-text-taken-from-the-db

  2. Кроме того, когда вы отправляете сообщение на /Campaign/Overview/996e19da-c5e6-e511-948f-005056822904/campain-user-friendly-text-taken-from-the-db и в методе, который вы делаете return View(vm);, он должен сохранить этот URL.

  3. И последнее, но не менее важное: когда вы используете @ Html.ActionLink («Щелкните здесь», «Обзор», «Кампания»), я хотел бы, чтобы он создавал ссылку с удобным для пользователя текстом (который будет чем-то другим в случае кампании и сервис).

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

Здесь задан похожий вопрос: Как создать удобные для пользователя URL-адреса, такие как stackoverflow ?, но он не отвечает на мой вопрос.


person Michal B.    schedule 18.03.2016    source источник
comment
Его называют слизняком. Обратитесь к этому ответу, чтобы узнать, как реализовать Это.   -  person    schedule 18.03.2016
comment
Я не знал об имени. Спасибо, я обязательно смогу найти больше информации об этом сейчас. С другой стороны, в реализации, представленной по вашей ссылке, мне нужно проверить наличие слага в каждом методе. Это кажется немного повторяющимся, я бы предпочел поместить это в одно место. Есть идеи, как это сделать лучше всего? Я могу придумать атрибут, украшающий метод, но ... опять же, может быть, есть хороший шаблон, и я изобретаю колесо ;-)   -  person Michal B.    schedule 18.03.2016
comment
Если вы предоставляете только идентификатор, вам необходимо найти соответствующую таблицу базы данных, связанную с контроллером. Я думаю, что FilterAttribute мог работать только тогда, когда имя вашего контроллера точно совпадало с именем вашей таблицы (или, по крайней мере, с каким-то соглашением, чтобы вы могли сопоставить их) и вызвать некоторый общий метод GetSlug(Guid ID).   -  person    schedule 18.03.2016
comment
Для каждого контроллера я могу определить тип, который также используется в IDBSet в моем DbContext, чтобы это сработало. Я также мог бы создать расширение шаблона HtmlHelper, чтобы получить ярлыки для разных типов. И для View я мог бы сделать переопределение, которое получило бы слизняк и поместило бы его на место. Я думаю, все это имеет смысл. Большое спасибо за помощь! Если кто-то знает какой-то пакет, который делает эти вещи, поэтому мне не нужно реализовывать его самостоятельно, дайте мне знать :-)   -  person Michal B.    schedule 18.03.2016
comment
Не тестировалось, но если вы используете шаблон репозитория и DI для внедрения своего контекста, и у вас есть BaseController со свойством (скажем) protected IRepository<TEntity> Repository, тогда вы сможете использовать что-то вроде string slug = filterContext.Controller.Repository.GetSlug(filterContext.ActionParameters["ID"]);   -  person    schedule 18.03.2016
comment
Обратите внимание, что, хотя вы не упомянули об этом, вы можете удалить этот уродливый GUID из URL-адреса, сохранив URL-адреса в постоянном хранилище данных и просмотрев первичный ключ через маршрутизация на основе данных.   -  person NightOwl888    schedule 18.03.2016
comment
Очень мило @ NightOwl888, спасибо!   -  person Michal B.    schedule 22.03.2016