URL firendly pengguna di aplikasi ASP.NET MVC5

Saya membuat aplikasi ASP.NET MVC. Saat ini tautan saya terlihat seperti:

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

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

Saya ingin mereka terlihat seperti:

/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. Artinya ketika Anda mengakses /Campaign/Overview/996e19da-c5e6-e511-948f-005056822904/ Anda seharusnya mendapatkan 301 dan dialihkan ke /Campaign/Overview/996e19da-c5e6-e511-948f-005056822904/campain-user-friendly-text-taken-from-the-db

  2. Selain itu, saat Anda memposting ke /Campaign/Overview/996e19da-c5e6-e511-948f-005056822904/campain-user-friendly-text-taken-from-the-db dan dalam metode yang Anda lakukan return View(vm);, URL tersebut harus tetap disimpan.

  3. Dan yang terakhir, namun tidak kalah pentingnya ketika Anda menggunakan @Html.ActionLink("Klik di sini", "Ikhtisar", "Kampanye") Saya ingin membuat tautan dengan teks yang ramah pengguna (yang akan menjadi sesuatu yang lain dalam kasus kampanye dan layanan).

Apa solusi termudah untuk apa yang saya inginkan? Saya dapat memikirkan hal-hal yang dapat saya lakukan dengan perutean dan beberapa ekstensi htmlHelper, tetapi saya merasa membuatnya terlalu rumit dan saya menciptakan kembali rodanya. Apakah saya?

Pertanyaan serupa telah ditanyakan di sini: Bagaimana cara membuat url yang ramah pengguna seperti stackoverflow ?, tapi itu tidak menjawab pertanyaan saya.


person Michal B.    schedule 18.03.2016    source sumber
comment
Ini disebut sebagai siput. Lihat jawaban ini untuk mengetahui satu cara mengimplementasikan dia.   -  person    schedule 18.03.2016
comment
Saya tidak tahu tentang namanya. Terima kasih, saya pasti dapat menemukan info lebih lanjut tentangnya sekarang. Di sisi lain, dalam implementasi yang disediakan di bawah tautan Anda, saya perlu memeriksa siput di setiap metode. Ini sepertinya agak berulang, saya lebih suka meletakkannya di satu tempat. Adakah yang tahu bagaimana hal ini bisa dilakukan dengan sebaik-baiknya? Saya dapat memikirkan atribut yang menghiasi metode ini, tetapi...sekali lagi, mungkin ada pola yang bagus dan saya menciptakan kembali rodanya ;-)   -  person Michal B.    schedule 18.03.2016
comment
Jika Anda hanya memberikan ID, maka Anda perlu mencari tabel database relevan yang terkait dengan pengontrol. Saya pikir satu-satunya cara FilterAttribute dapat berfungsi adalah jika nama pengontrol Anda sama persis dengan nama tabel Anda (atau setidaknya beberapa konvensi sehingga Anda dapat mencocokkannya) dan memanggil beberapa metode GetSlug(Guid ID) generik.   -  person    schedule 18.03.2016
comment
Per pengontrol saya dapat menentukan tipe yang juga digunakan di IDBSet di DbContext saya, sehingga itu bisa berfungsi. Saya juga dapat membuat ekstensi template HtmlHelper untuk mendapatkan slug untuk berbagai jenis. Dan untuk Tampilannya saya bisa melakukan override yang akan mengambil siput dan meletakkannya di tempatnya. Menurutku semuanya masuk akal. Terima kasih banyak atas bantuannya! Jika seseorang mengetahui suatu paket yang melakukan hal-hal tersebut, jadi saya tidak perlu mengimplementasikannya sendiri, tolong beri tahu saya :-)   -  person Michal B.    schedule 18.03.2016
comment
Tidak diuji, tetapi jika Anda menggunakan Pola Repositori dan DI untuk memasukkan konteks Anda, dan Anda memiliki BaseController dengan properti (misalnya) protected IRepository<TEntity> Repository, maka Anda akan dapat menggunakan sesuatu seperti string slug = filterContext.Controller.Repository.GetSlug(filterContext.ActionParameters["ID"]);   -  person    schedule 18.03.2016
comment
Perhatikan bahwa meskipun Anda tidak menyebutkannya, Anda dapat menghapus GUID jelek itu dari URL dengan menyimpan URL di penyimpanan data persisten Anda dan mencari kunci utama melalui perutean berdasarkan data.   -  person NightOwl888    schedule 18.03.2016
comment
Sangat bagus @ NightOwl888, terima kasih!   -  person Michal B.    schedule 22.03.2016