Łukasz Baran
Łukasz Baran

Reputation: 1239

asp .net mvc routing url with custom literal

Is it possible to make url with custom literal separator that can have default parameters ?

context.MapRoute(
            "Forums_links",
            "Forum/{forumId}-{name}",
            new { area = "Forums", action = "Index", controller = "Forum" },
            new[] { "Jami.Web.Areas.Forums.Controllers" }
        );

I have this as you see im using to dash to separate id from name so I can have url like:

/Forum/1-forum-name

Instead of:

/Forum/1/forum-name

I see the problem is I'm using multiple dashes. And routing engine don't know which one to separate. But overalll it doesn't change my question because I want to use multiple dashes anyway.

Upvotes: 3

Views: 1149

Answers (2)

mccow002
mccow002

Reputation: 6914

Very interesting question.

The only way I could come up with is much like Daniel's, with one extra feature.

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" }
);

That way, the only items that will get matched to this route are ones formatted in the pattern of:

[one or more digit]-[zero or more repeating groups of string separated by dashes]-[final string]

From here you would use the method Daniel posted to parse the data you need from the forumIdAndName parameter.

Upvotes: 2

Daniel Liuzzi
Daniel Liuzzi

Reputation: 17147

One way to achieve this could be by combining id and name into the same route value:

context.MapRoute(
            "Forums_links",
            "Forum/{forumIdAndName}",
            new { area = "Forums", action = "Index", controller = "Forum" },
            new[] { "Jami.Web.Areas.Forums.Controllers" }
        );

And then extract the Id from it:

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;
}

Upvotes: 2

Related Questions