我有以下路线:
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
}
);
再次感谢任何帮助。
由于
答案 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。这不是一个想法,但它会起作用,直到找到更好的东西。