ChevCast
ChevCast

Reputation: 59193

Can't seem to check RouteData for an optional parameter

I have a page route with an optional "id" parameter. Defined like so:

        routes.MapPageRoute(null,
            "projects/{operation}/{id}",
            "~/Projects/ProjectWizard.aspx",
            true,
            new RouteValueDictionary(new
            {
                operation = "new",
                id = UrlParameter.Optional
            }),
            new RouteValueDictionary(new
            {
                operation = @"new|edit",
                id = @"\d*"
            })
        );

The route works fine, but when I get to the page if I haven't included the optional "id" parameter then my code fails when trying to convert to integer.

        var operation = RouteData.Values["operation"].ToString();
        var projectId = RouteData.Values.ContainsKey("id") ? Convert.ToInt32(RouteData.Values["id"]) : 0;

This works great as long as I pass in an ID in the route like this:

http://webapp/projects/edit/123

projectId is equal to 123 just like it should be. But if I don't include the ID:

http://webapp/projects/new

The route goes to the page fine but I get this error:

Unable to cast object of type 'System.Web.Mvc.UrlParameter' to type 'System.IConvertible'.


It should be unable to find the key in the route data values and then assign a zero to projectId, but it doesn't. I keep trying different ways to check for null for the "id" route value but it doesn't seem to like that very much.

Upvotes: 1

Views: 1901

Answers (1)

Mirko
Mirko

Reputation: 4282

That would work perfectly were you dealing with MVC controller actions here and MapRoute.

What I would do in your case is simply set the default for your id in the defaults instead of UrlParameter.Optional, so:



routes.MapPageRoute(null,
    "projects/{operation}/{id}",
    "~/Projects/ProjectWizard.aspx",
    true,
    new RouteValueDictionary(new
    {
        operation = "new",
        id = "0"
    }),
    new RouteValueDictionary(new
    {
        operation = @"new|edit",
        id = @"\d*"
    })
);

then simply read your id like so:


var operation = RouteData.Values["operation"].ToString();
var projectId = int.Parse(RouteData.Values["id"].ToString());

Upvotes: 2

Related Questions