asp.net-mvc - ASP.NET 4 RTM 中的可选路由参数不再像以前一样工作

标签 asp.net-mvc asp.net-mvc-2 asp.net-4.0 asp.net-routing

我将我的项目升级到 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}
);

在 .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并且通过此规则正确映射 imageIDtitle两者都被分配 null在我的 Controller 中。

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

最佳答案

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

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

假设以下 Controller 和操作:
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 项目上测试。

关于asp.net-mvc - ASP.NET 4 RTM 中的可选路由参数不再像以前一样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2626791/

相关文章:

javascript - 如何在子页面帖子的父页面中重新加载部分 View

.net - ASP.Net 发布超时

c# - asp 按钮里面的 Font Awesome

asp.net - 处理程序类代码未触发

node.js - MSBuild 是否有必要在 Angular2 的依赖项(在 node_modules 中)中转换 .ts 文件以使 Angular2 工作?

asp.net-mvc - 丢失的迁移和 Azure 数据库现在不同步

jquery - Telerik ASP .NET MVC Grid - 添加自定义删除按钮

c# - 试图创建一个没有代码隐藏页面的 asp.net mvc viewpage

asp.net - 无法调试 MVC2 项目中的 View ,出现 "The resource cannot be found"错误

asp.net-mvc - 从 ASP.NET MVC 开始