我希望我的MVC网址如此:
http://www.site.com/project/id/projectname
示例:
http://www.site.com/project/5/new-website
我的控制器是:
public ActionResult Details(int id, string projectname)
我的任何行动链接都是:
@Html.ActionLink("click here", "Details", "Project", new { id = project.ProjectID, projectname = project.ProjectName })
我的路线是:
routes.MapRoute(
"Project",
"project/{id}/{projectname}",
new { controller = "Project", action = "Details", id = "", projectname = "" }
);
当然系统有足够的信息,知道项目名称将是Url的一部分,所以它应该UrlEncode链接,从而用连字符替换空格?但事实并非如此,因此空间变为%20
我不确定我在哪里定制这个?我是否覆盖了Html.ActionLink?在每次编辑时在数据库中存储名称的“URL-ready”版本 - 在应该动态地自动完成时似乎是一种浪费。而且我不想每次使用Html.ActionLink时都要调用“FriendlyURL”函数 - 再次,它应该自动处理。
答案 0 :(得分:1)
将空格字符更改为%20
是网址编码的结果。对URL编码空格字符时,它不会转换为连字符。如果确实如此,那么当您编码URL时,您认为连字符会被转换为什么?
正如@ RK911指出的那样,你想要做的是创建一个slug。
有几种方法可以做到这一点:
1。)限制你的projectname
数据以禁止空格,并且只允许连字符(在数据输入期间可能使用连字符)。
2。)将slug分别存储在数据库中,例如projectslug
。
3。)创建一个扩展方法,为您“动态”执行此操作。
以下是使用the link that @RK911 referenced的#3的示例:
public static class SlugExtensions
{
public static string AsSlug(this string phrase)
{
string str = phrase.RemoveAccent().ToLower();
// invalid chars
str = Regex.Replace(str, @"[^a-z0-9\s-]", "");
// convert multiple spaces into one space
str = Regex.Replace(str, @"\s+", " ").Trim();
// cut and trim
str = str.Substring(0, str.Length <= 45 ? str.Length : 45).Trim();
str = Regex.Replace(str, @"\s", "-"); // hyphens
return str;
}
private static string RemoveAccent(this string txt)
{
byte[] bytes = System.Text.Encoding.GetEncoding("Cyrillic").GetBytes(txt);
return System.Text.Encoding.ASCII.GetString(bytes);
}
}
@Html.ActionLink("click here", "Details", "Project",
new { id = project.ProjectID,
projectname = project.ProjectName.AsSlug() })