2011-10-21 67 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

相关问题