ASP.NET 4 RTM中的可选路由参数不再像以前那样工作

Sim*_*ver 6 asp.net-mvc asp.net-routing asp.net-4.0 asp.net-mvc-2

我今天将我的项目升级到ASP.NET 4 RTMASP.NET MVC 2.0 RTM.

我以前用ASP.NET 3.5ASP.NET MVC 2.0 RTM.

我的一些路线突然不起作用,我不知道为什么.我不确定是否在3.5和4.0之间发生了变化 - 或者这是否是4.0 RTM中的回归类型问题.(我以前从未用4.0测试过我的应用程序).

我喜欢使用它Url.RouteUrl("route-name", routeParams)来避免生成URL时出现歧义.这是我对画廊页面的路线定义.我想imageID成为可选项(如果你没有指定它,你会得到一个缩略图页面).

// gallery id
routes.MapRoute(
    "gallery-route",
    "gallery/{galleryID}/{imageID}/{title}",
    new { controller = "Gallery", action = "Index", 
          galleryID = (string) null, 
          imageID = (string) null, 
          title = (string) null}
);
Run Code Online (Sandbox Code Playgroud)

在.NET 3.5/ASP.NET 2.0 RTM/IIS7中

Url.RouteUrl("gallery-route", new { galleryID = "cats"})
=> /gallery/cats

Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4")             
=>  /gallery/cats/4

Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4", title = "tiddles")  
=>  /gallery/cats/4/tiddles
Run Code Online (Sandbox Code Playgroud)

在.NET 4.0 RTM/ASP.NET 2.0 RTM/IIS7中

Url.RouteUrl("gallery-route", new { galleryID = "cats"})
=> null

Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4")             
=>  /gallery/cats/4

Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4", title = "tiddles")  
=>  /gallery/cats/4/tiddles
Run Code Online (Sandbox Code Playgroud)

以前我只能提供galleryID,生成的URL中会忽略其他所有内容.但现在看起来我需要指定所有参数,直到title- 或者它在确定URL时放弃了.

传入的URL工作正常,/gallery/cats并通过此规则正确映射,imageID并在控制器title中分配null.

我还用http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx测试了INCOMING路线,它们都运行良好.

Dar*_*rov 5

在ASP.NET MVC 2.0中指定可选参数的正确方法是使用UrlParameter.Optional字段:

routes.MapRoute(
    "gallery-route",
    "gallery/{galleryID}/{imageID}/{title}",
    new
    {
        controller = "Gallery",
        action = "Index",
        galleryID = UrlParameter.Optional,
        imageID = UrlParameter.Optional,
        title = UrlParameter.Optional
    }
);
Run Code Online (Sandbox Code Playgroud)

假设以下控制器和操作:

public class GalleryController : Controller
{
    public ActionResult Index(string galleryID, string imageID, string title)
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

所有这些都将按预期工作:

<%= Url.RouteUrl("gallery-route", new { galleryID = "cats" }) %><br/>
<%= Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4"}) %><br/>
<%= Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4", title = "tiddles" })%>
Run Code Online (Sandbox Code Playgroud)

呈现为:

/gallery/cats
/gallery/cats/4
/gallery/cats/4/tiddles
Run Code Online (Sandbox Code Playgroud)

备注:在Windows 7 x64,Visual Studio 2010 RTM,ASP.NET MVC 2.0项目上测试.