我有以下路线及其行动方法。
routes.MapRoute(
"Movies",
"Movies/{action}/{id}/{Genre}/{myprop}",
new { controller = "Movies", action = "Random", id=UrlParamter.Optional, Genre=UrlParameter.Optional,myprop = UrlParameter.Optional }
new { Genre=@"^[a-zA-Z]+$",myprop=@"\d{2}" }
);
public ActionResult Random(string id, string Genre, string myprop)
{
var movie = new Movie() { Name = "Shrek!" };
ViewBag.idgm = id + " " + Genre + " " + myprop;
return View(movie);
}
现在,当我尝试从此网址获取时:
http://localhost:60008/Movies/Random/5/qweqw
我得到了404.
但如果我尝试
http://localhost:60008/Movies/Random/5/qweqw/23
有效。我无法理解为什么会这样。有人可以帮忙吗?
这是我完整的地图路线方法:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Movies",
"Movies/{action}/{id}/{genre}/{myprop}",
new { controller = "Movies", action = "Random", genre = UrlParameter.Optional, myprop = UrlParameter.Optional },
new { Genre= @"^[a-zA-Z]+$", myprop=@"\d{2}" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{myid}",
defaults: new { controller = "Home", action = "Index", myid = UrlParameter.Optional }
);
}
答案 0 :(得分:1)
您获得第一个网址404的原因是因为myprop
的路由约束使该参数 - 它只匹配2位数数字,绝不是空字符串。
myprop=@"\d{2}"
要解决此问题,请更改正则表达式以匹配2位数字或空字符串。
myprop = @"\d{2}|^$"
^$
将匹配零长度字符串。 |
是正则表达式更改字符(逻辑OR的粗略等价物)。正则表达式必须允许空字符串通过,因此约束成功后才能分析值UrlParameter.Optional
。实际上,不需要允许零长度字符串匹配参数是必需的,因为首先发生正则表达式失败。