【问题标题】:Can't seem to check RouteData for an optional parameter似乎无法检查 RouteData 的可选参数
【发布时间】:2023-03-10 02:18:01
【问题描述】:

我有一个带有可选“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,但它似乎不太喜欢。

【问题讨论】:

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


    【解决方案1】:

    如果您在此处处理 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*"
        })
    );
    
    

    然后像这样简单地读取您的 ID:

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

    【讨论】:

      猜你喜欢
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      相关资源
      最近更新 更多