6

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

我以前使用ASP.NET 3.5with ASP.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}
);

在 .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

在 .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

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

传入的 URL 可以正常工作,/gallery/cats并且通过此规则正确映射,imageID并且两者都在我的控制器title中分配。null

我还使用http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx测试了 INCOMING 路由,它们都工作正常。

4

2 回答 2

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

假设以下控制器和动作:

public class GalleryController : Controller
{
    public ActionResult Index(string galleryID, string imageID, string title)
    {
        return View();
    }
}

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

<%= 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" })%>

呈现为:

/gallery/cats
/gallery/cats/4
/gallery/cats/4/tiddles

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

于 2010-04-17T19:16:44.560 回答
1

我知道问题是针对 MVC2 的,但在 MVC3 中,Darin Dimitrov 给出的答案将失败。

Phil Haack 在他的博客中解释了这个问题并给出了解决方法:http: //haacked.com/archive/2011/02/20/routing-regression-with-two-consecutive-optional-url-parameters.aspx

于 2011-06-21T08:36:48.560 回答