似乎无法检查RouteData是否有可选参数

时间:2012-05-10 20:38:48

标签: c# asp.net .net routing routes

我有一个带有可选“id”参数的页面路由。定义如下:

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

路由工作正常,但是如果我没有包含可选的“id”参数,当我到达页面时,我的代码在尝试转换为整数时失败。

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

只要我在这样的路径中传入ID,这就行得很好:

http://webapp/projects/edit/123

projectId就像它应该的那样等于123。但如果我不包括ID:

http://webapp/projects/new

路由转到页面正常但我收到此错误:

  

无法将“System.Web.Mvc.UrlParameter”类型的对象强制转换为“System.IConvertible”。


它应该无法在路径数据值中找到密钥,然后将零分配给projectId,但它不会。我一直在尝试不同的方法来检查“id”路由值的null,但它似乎并不那么喜欢。

1 个答案:

答案 0 :(得分:2)

如果您在这里处理MVC控制器操作和MapRoute,那将是完美的。

在您的情况下我要做的只是在默认值中设置您的ID的默认值而不是UrlParameter.Optional,所以:



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

然后简单地读取你的身份:


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