asp .net mvc路由网址与自定义文字

时间:2011-07-01 10:19:13

标签: asp.net-mvc routing

是否可以使用可以具有默认参数的自定义文字分隔符制作网址?

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

我发现问题是我正在使用多个破折号。并且路由引擎不知道要分开哪一个。但总体而言,它并没有改变我的问题,因为无论如何我想要使用多个破折号。

2 个答案:

答案 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参数中解析您需要的数据。