2011-10-21 70 views
5

的,我想我已經問過這個,但是該解決方案並沒有實際的意義。無論如何,我有我的看法ActionLinks這樣的:MVC路線ActionLink的網址使用名稱,而不是ID

foreach(var item in Model){ 
<%: Html.ActionLink(item.Name, "Details", new {id = item.Id}) %> 
} 

現在,當它到我的行動細節顯然,這將是URL

/MyThings/Details/{id} 

我想知道是否有可能以顯示名稱而不是id使用一個slug?或修改全球ASAX像這樣:

/MyThings/Details/CarKeys 

的東西是名需要是唯一的,是有辦法,我可以修改全局ASAX顯示的名稱,而不是ID?

任何意見是非常感謝!

回答

6

當然,你只需要改變你的路由規則。看在你的Global.asax.cs文件,或您所在地區的註冊文件,這樣的事情:

routes.MapRoute(..., "{controller}/{action}/{id}", ...); 

...並改變它的東西是這樣的:

routes.MapRoute(..., "{controller}/{action}/{name}", ...); 

然後讓你的行動取名稱而不是ID:

Html.ActionLink(item.Name, "Details", new {item.Name}) 
+0

是的,但是這將需要更改查詢wonce它獲取控制器是否正確?所以從公共ActionResult Details(int id)到public ActionResult Deatils(string name)。我有點想避免這種情況,但如果沒有任何選擇,那麼我覺得這是一條路要走? – gdubs

+0

取決於。你的控制器的'{id}'參數是否需要一個名字?如果是的話那麼就'新{ID = item.Name}' – Buildstarted

+0

@gdubs:是的,如果你打算通過它的名稱來標識的東西,你顯然需要使用比如果你通過識別其不同的查詢它的ID。有一些先進的綁定技巧可以用來解決這個問題,但我會說你應該保持簡單。如果你想方便的ID,但也想包括名稱,使它看起來不錯,只需包括像惡意指出。 – StriplingWarrior

8

如果這僅用於SEO目的,只需包括ID和名稱。該名稱將成爲URL的一部分,但不會被您的應用程序使用。只需添加使用模板另一條路線:{controller}/{action}/{id}/{name}

你還需要改變你的名字,以確保它只有對於網址有效字符。網上有很多關於這個的文章,而且非常簡單。這裏有一個例子:http://chrismckee.co.uk/creating-url-slugs-permalinks-in-csharp/

+0

好吧,它更適合更好的用戶體驗,以rottentomatoes.com爲例,如果我點擊一個鏈接>> http://www.rottentomatoes.com/m/the_ides_of_march/它會指示我在m控制器上的記錄。我在想他們可能會使用那個頭銜作爲記錄中的一把鑰匙?沒有?並感謝您的鏈接btw! – gdubs

相關問題