URL ของผู้ใช้ firendly ในแอปพลิเคชัน 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
หากคุณระบุ ID เพียงอย่างเดียว คุณจะต้องค้นหาตารางฐานข้อมูลที่เกี่ยวข้องซึ่งเชื่อมโยงกับคอนโทรลเลอร์ ฉันคิดว่าวิธีเดียวที่ FilterAttribute สามารถทำงานได้คือถ้าชื่อคอนโทรลเลอร์ของคุณตรงกับชื่อตารางของคุณทุกประการ (หรืออย่างน้อยก็แบบแผนบางอย่างเพื่อให้คุณสามารถจับคู่พวกมันได้) และเรียกเมธอด GetSlug(Guid ID) ทั่วไปบางอย่าง   -  person    schedule 18.03.2016
comment
ต่อคอนโทรลเลอร์ ฉันสามารถกำหนดประเภทที่ใช้ใน IDBSet ใน DbContext ของฉันได้เพื่อที่จะใช้งานได้ ฉันยังสามารถสร้างส่วนขยายเทมเพลต HtmlHelper เพื่อรับทากสำหรับประเภทต่างๆ และสำหรับมุมมอง ฉันสามารถแทนที่ซึ่งจะทำให้ทากและวางไว้ที่เดิมได้ ฉันคิดว่ามันสมเหตุสมผล ขอบคุณมากสำหรับความช่วยเหลือ! หากมีใครรู้จักแพ็คเกจที่ทำสิ่งเหล่านั้น ดังนั้นฉันจึงไม่จำเป็นต้องติดตั้งด้วยตัวเอง โปรดแจ้งให้เราทราบ :-)   -  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