是否可以使用可以具有默认参数的自定义文字分隔符制作网址?
context.MapRoute(
"Forums_links",
"Forum/{forumId}-{name}",
new { area = "Forums", action = "Index", controller = "Forum" },
new[] { "Jami.Web.Areas.Forums.Controllers" }
);
我有这个,因为你看到我使用破折号将id与名字分开,所以我可以有这样的网址:
/Forum/1-forum-name
而不是:
/Forum/1/forum-name
我发现问题是我正在使用多个破折号。并且路由引擎不知道要分开哪一个。但总体而言,它并没有改变我的问题,因为无论如何我想要使用多个破折号。
答案 0 :(得分:2)
实现这一目标的一种方法是将id和name组合到相同的路由值中:
context.MapRoute(
"Forums_links",
"Forum/{forumIdAndName}",
new { area = "Forums", action = "Index", controller = "Forum" },
new[] { "Jami.Web.Areas.Forums.Controllers" }
);
然后从中提取Id:
private static int? GetForumId(string forumIdAndName)
{
int i = forumIdAndName.IndexOf("-");
if (i < 1) return null;
string s = forumIdAndName.Substring(0, i);
int id;
if (!int.TryParse(s, out id)) return null;
return id;
}
答案 1 :(得分:2)
非常有趣的问题。
我能想出的唯一方法就像丹尼尔一样,还有一个额外的功能。
context.MapRoute(
"Forums_links",
"Forum/{forumIdAndName}",
new { area = "Forums", action = "Index", controller = "Forum" },
new { item = @"^\d+-(([a-zA-Z0-9]+)-)*([a-zA-Z0-9]+)$" } //constraint
new[] { "Jami.Web.Areas.Forums.Controllers" }
);
这样,与此路线匹配的唯一项目是以下列模式格式化的项目:
[one or more digit]-[zero or more repeating groups of string separated by dashes]-[final string]
从这里开始,您将使用Daniel发布的方法从forumIdAndName参数中解析您需要的数据。