具有可空值的asp.net MVC路由 - 更新23/2 - UrlParameter.Optional

时间:2010-02-21 18:52:26

标签: asp.net-mvc model-view-controller routing

我有以下路线:

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,但我希望其中一些参数为空,因此网址可能如下: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。

自从迁移到版本2以来,另一个问题是RedirectToRoute似乎找不到路由。我得到了

  

路由表中没有路由与提供的值匹配。

错误消息。我的代码如下:

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

再次感谢任何帮助。

由于

3 个答案:

答案 0 :(得分:0)

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

还有其他需要注意的地方,MVC2 不需要.Net 4 ,它也会在3.5上运行。这意味着如果您可以稍等一下,您可以在不进行完整4.0升级的情况下访问MVC2并获得此功能。

答案 1 :(得分:0)

有点长的啰嗦,但它应该可以解决问题。

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

我应该注意,鉴于ASP.NET MVC对路由很懒惰,它可能必须处于顺序中,并且它将找到匹配的第一个路由。也就是说,您应该考虑将ID的约束设置为@"\d{1,}",因为它们可能会一直打到那个......

答案 2 :(得分:0)

在查看UrlParameter.Optional并按照here所述创建操作过滤器之后,我仍然无法使用空值。

最后,我将零传递给动作并检查其是否为零,然后将值设为null。这不是一个想法,但它会起作用,直到找到更好的东西。