代码之家  ›  专栏  ›  技术社区  ›  lancscoder

具有可为空值的ASP.NET MVC路由-已更新23/2-urlParameter。可选

  •  1
  • lancscoder  · 技术社区  · 14 年前

    我有以下路线:

    routes.MapRoute(
    "Search",
    "Search.aspx/l-{lID}/t-{tID}/p-{pID}/s-{sID}",
    new { 
        controller = "Search", 
        action = "Search", 
        lID = "",
        tID = "", 
        pID = "", 
        sID = "" },
    new { lID = @"\d{0,}", 
        tID = @"\d{0,}", 
        pID = @"\d{0,}", 
        sID = @"\d{0,}" }
    );
    

    如果我的网址是 http://localhost:1234/Search.aspx/l-1/t-1/p-1/s-1 但我希望这些参数中的一些为空,因此URL可能如下所示: http://localhost:1234/Search.aspx/l-/t-/p-1/s- 然而,当这种情况发生时,我总是得到404个错误。

    有人知道我如何使这条路线工作,这样我就可以有空值吗?

    更新:

    按照建议,我将项目升级到MVC 2,但问题仍然存在。我现在的路线是:

    routes.MapRoute(
    "Search",
    "Search.aspx/l-{lID}/t-{tID}/p-{pID}/s-{sID}",
    new
    {
       controller = "Search",
       action = "Search",
       lID = UrlParameter.Optional,
       tID = UrlParameter.Optional,
       pID = UrlParameter.Optional,
       sID = UrlParameter.Optional
    },
    new
    {
       lID = @"\d{0,}",
       tID = @"\d{0,}",
       pID = @"\d{0,}",
       sID = @"\d{0,}" }
    );
    

    在试图查看包含空值的视图时,我仍然得到404。

    return RedirectToRoute( 
    "Search", 
    new { 
        lID = lID, 
        tID = tID,
        pID = pID,
        sID = sID 
        } 
    );
    

    3 回复  |  直到 14 年前
        1
  •  0
  •   Nick Craver    14 年前

    可选的URL参数作为MVC2的一部分提供- Check out Phil Haack's post explaining it . 这是在MVC 2 RC 2中添加的。

    需要注意的是,MVC2会 不需要.NET 4 它也将在3.5上运行。这意味着,如果您可以稍等一下,您可以在不进行完整的4.0升级的情况下转到MVC2并获得此功能。

        2
  •  0
  •   Dan Atkinson    14 年前

    有点喘不过气来,但它应该起作用。

    //All params.
    routes.MapRoute(
      "Search",
      "Search.aspx/l-{lID}/t-{tID}/p-{pID}/s-{sID}",
      new { 
        controller = "Search", 
        action = "Search", 
        lID = "",
        tID = "", 
        pID = "", 
        sID = ""
      },
      new {
        lID = @"\d{0,}", 
        tID = @"\d{0,}", 
        pID = @"\d{0,}", 
        sID = @"\d{0,}"
      }
    );
    
    //First three params
    routes.MapRoute(
      "Search",
      "Search.aspx/l-{lID}/t-{tID}/p-{pID}",
      new { 
        controller = "Search", 
        action = "Search", 
        lID = "",
        tID = "", 
        pID = "", 
      },
      new {
        lID = @"\d{0,}", 
        tID = @"\d{0,}", 
        pID = @"\d{0,}", 
      }
    );
    
    //First two params
    routes.MapRoute(
      "Search",
      "Search.aspx/l-{lID}/t-{tID}",
      new { 
        controller = "Search", 
        action = "Search", 
        lID = "",
        tID = "", 
      },
      new {
        lID = @"\d{0,}", 
        tID = @"\d{0,}", 
      }
    );
    
    //First param
    routes.MapRoute(
      "Search",
      "Search.aspx/l-{lID}",
      new { 
        controller = "Search", 
        action = "Search", 
        lID = "",
      },
      new {
        lID = @"\d{0,}", 
      }
    );
    
    //No params.
    routes.MapRoute(
      "Search",
      "Search.aspx",
      new { 
        controller = "Search", 
        action = "Search", 
      }
    );
    

    我要注意的是,它可能必须按IS顺序排列,因为ASP.NET MVC对路由比较懒惰,并且会到达它找到匹配的第一个路由。也就是说,您应该考虑将ID上的约束设置为 @"\d{1,}" 因为他们可能会一直打那个…

        3
  •  0
  •   lancscoder    14 年前

    在查看了两个urlParameter.optional之后,创建一个操作过滤器,如前所述 here 我仍然无法使用空值。

    最后,我将零传递给该操作,并检查它是否为零,然后使值为空。这不是一个理想的情况,但在我找到更好的东西之前,它是有效的,并且会一直持续下去。