ASP.NET MVC:出现空ActionLinks

ror*_*yok 2 asp.net-mvc asp.net-mvc-routing asp.net-mvc-3

我正在使用默认路由,因此我不需要指定控制器.

routes.MapRoute(
    "Default", 
    "{action}/{id}", 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

有了这个,我可以创建像myapp.com/Customers而不是myapp.com/Home/Customers这样的网址

当我在本地测试时,一切都很好.当我上传实时版本时,使用Html.ActionLink生成的任何链接都是空的.我知道我正在使用Html.ActionLink,因为它在本地工作正常:

//                   Title                 Action      Controller
<%: Html.ActionLink("Manage My Settings", "Settings", "Home") %>
Run Code Online (Sandbox Code Playgroud)

我删除了所有路由,但默认情况下,尝试使用和不使用控制器等指定ActionLink.我甚至尝试恢复路由中的控制器,例如:

"{controller}/{action}/{id}"
Run Code Online (Sandbox Code Playgroud)

什么都没有.一切都在当地工作.有点生气.

更新:

好的,发现了一个奇怪的发现.我在id之后实际上有另一个可选的UrlParameter,称为page.我愚蠢地没有在示例中包含它,因为我认为它没有任何区别.如果我把它拿出来,事情似乎有效.

所以,实际上,这有效:

routes.MapRoute(
   "Default", 
   "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

这个作品!

routes.MapRoute(
   "Default", 
   "{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

但是没有工作

routes.MapRoute(
   "Default", 
   "{action}/{id}/{page}", 
    new { controller = "Home", action = "Index", 
    id = UrlParameter.Optional, page = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

为什么不?

ror*_*yok 5

找到答案了!当使用两个连续的可选UrlParameters时,MVC3中存在一个错误,如Phil Haack所详述,这里为routing-regression-with-two-consecutive-optional-url-parameters

您需要首先声明一个只有一个可选参数的路由版本.所以

routes.MapRoute(
    "Default", // Route name
    "{action}/{id}", // URL with ONE parameter
    new { controller = "Home", action = "Index", 
    id = UrlParameter.Optional } // Parameter defaults
);

routes.MapRoute(
    "Default_with_page", // Route name
    "{action}/{id}/{page}", // URL with TWO parameters
    new { controller = "Home", action = "Index", 
    id = UrlParameter.Optional, page = UrlParameter.Optional } 
    // Parameter defaults
);
Run Code Online (Sandbox Code Playgroud)

现在似乎很明显.如果我真的包含了所有细节,我肯定Serghei或其他人会看到这个问题,所以感谢所有的帮助!