1

我有一个带有可选“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”路由值是否为空,但它似乎不太喜欢。

4

1 回答 1

2

如果您在此处处理 MVC 控制器操作和 MapRoute,那将非常有效。

在您的情况下,我会做的只是在默认值而不是 UrlParameter.Optional 中为您的 id 设置默认值,因此:



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());
于 2012-05-11T06:25:28.630 回答