maproute方法asp.net mvc中基于约定的Route的问题

时间:2018-02-20 09:22:14

标签: asp.net asp.net-mvc routes url-routing asp.net-mvc-routing

我有以下路线及其行动方法。

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 }
    );
}

1 个答案:

答案 0 :(得分:1)

您获得第一个网址404的原因是因为myprop的路由约束使该参数 - 它只匹配2位数数字,绝不是空字符串。

myprop=@"\d{2}"

要解决此问题,请更改正则表达式以匹配2位数字空字符串。

myprop = @"\d{2}|^$"

说明

^$将匹配零长度字符串。 |是正则表达式更改字符(逻辑OR的粗略等价物)。正则表达式必须允许空字符串通过,因此约束成功后才能分析值UrlParameter.Optional。实际上,不需要允许零长度字符串匹配参数是必需的,因为首先发生正则表达式失败。

参考:Zero-Length Regex Matches