mvc route actionlink url使用名称而不是id

gdu*_*ubs 5 asp.net-mvc routes global-asax asp.net-mvc-3

我想我已经问过了,但解决方案并没有真正有意义.无论如何,我在我的观点上有这样的ActionLinks:

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

现在,当它进入我的行动细节显然这将是网址

/MyThings/Details/{id}
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以显示该项目的名称而不是id使用slug?或像这样修改全局asax:

/MyThings/Details/CarKeys
Run Code Online (Sandbox Code Playgroud)

事情是名称需要是唯一的,有没有办法我可以修改全局asax来显示名称而不是id?

任何建议都非常感谢!

Mal*_*nce 8

如果这仅用于搜索引擎优化目的,只需包括ID和名称.该名称将是URL的一部分,但您的应用程序不会使用该名称.只需添加另一个使用该模板的路线:{controller}/{action}/{id}/{name}

您还需要转换您的名称,以确保它只包含有效的网址字符.网上有很多关于此的文章,而且非常简单.这是一个例子:http://chrismckee.co.uk/creating-url-slugs-permalinks-in-csharp/


Str*_*ior 6

当然,您只需要更改路由规则.查看您的Global.asax.cs文件或区域注册文件中的内容,如下所示:

routes.MapRoute(..., "{controller}/{action}/{id}", ...);
Run Code Online (Sandbox Code Playgroud)

...并将其更改为以下内容:

routes.MapRoute(..., "{controller}/{action}/{name}", ...);
Run Code Online (Sandbox Code Playgroud)

然后让您的操作采用名称而不是ID:

Html.ActionLink(item.Name, "Details", new {item.Name})
Run Code Online (Sandbox Code Playgroud)