4

我创建了这条路线

          routes.MapRoute( 
                name: "Survey", 
                url: "{controller}/{action}/{surveyid}/{userid}/{hash}", 
                defaults: new { controller = "Home", action = "Survey" }, 
                constraints: new { surveyid = @"\d+", userid = @"\d+" } 
           );

当我然后浏览到

http://localhost:3086/Home/Survey/1/1/3r2ytg

它可以工作,但是如果我浏览到

http://localhost:3086/1/1/3r2ytg

这没用。

如果我像这样改变路线

        routes.MapRoute(
            name: "Survey",
            url: "{surveyid}/{userid}/{hash}",
            defaults: new { controller = "Home", action = "Survey" },
            constraints: new { surveyid = @"\d+", userid = @"\d+" }
        );

正好相反会起作用(这是有道理的)。

但我对第一条路线感到好奇,我认为这两个 URL 都应该起作用,因为它应该在没有给出默认控制器和动作时抓取默认控制器和操作。

更新

最后我只用了这个

        routes.MapRoute(
            name: "Survey",
            url: "{surveyId}/{userId}/{hash}",
            defaults: new { controller = "Home", action = "Survey" },
            constraints: new { surveyId = @"\d+", userId = @"\d+" }
        );

因为那是我想要的行为。但是,当我然后打电话时

@Url.Action("Survey", "Home", new 
{ 
    userId = @Model.UserId, 
    surveyId = survey.Id, 
    hash = HashHelpers.CreateShortenedUrlSafeHash(@Model.SecretString + survey.Id.ToString() + @Model.UserId.ToString())
})

它生成

/Admin/Home/Survey?userId=25&surveyId=19&hash=2Norc

而不是一条闪亮的路径。我可以用 Url.RouteUrl 强制它,但我认为它应该自动选择这个。

4

2 回答 2

3

您需要为每个组合创建路线。

检查这篇Phil Haack 文章

  routes.MapRoute( 
            name: "Survey", 
            url: "{controller}/{action}/{surveyid}/{userid}/{hash}", 
            defaults: new { controller = "Home", action = "Survey" }, 
            constraints: new { surveyid = @"\d+", userid = @"\d+" } 
  );

  routes.MapRoute(
        name: "Survey",
        url: "{surveyid}/{userid}/{hash}",
        defaults: new { controller = "Home", action = "Survey" },
        constraints: new { surveyid = @"\d+", userid = @"\d+" }
  );

使用 MVC3 中的两个可选参数检查此路由不起作用

于 2013-10-11T09:02:07.467 回答
1

路由处理程序并不真正知道,如果您说 /1/1/3r2ytg 1 用于surveyId,另一个1 用于userId 等。
它只知道路径(localhost:3086)和x个“文件夹”
所以如果你打电话给http://localhost:3086/1/1/3r2ytg他,他会将 1 映射到控制器,1 映射到操作,3r2ytg 映射到surveyId。
它找不到 userId 或 hash,由于没有指定默认值,他找不到路由。
您的第一条路线中的默认值是毫无意义的,因为它们永远不会触发。
默认值应该在您的网址的末尾,这有点道理。

于 2013-10-11T08:53:11.963 回答