.net mvc route默认控制器/操作但不是默认参数

时间:2013-10-11 08:45:02

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing mvcroutehandler

我创建了这条路线

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

完全相反的情况会起作用(这是有道理的)。

但是我对第一条路线感到好奇,我认为这两个网址都应该有效,因为当没有给出时,它会抓住默认的控制器和动作。

更新

最后我只使用了这个

        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强制它,但我认为应该自动选择这个。

2 个答案:

答案 0 :(得分:3)

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

选中 Phil Haack Article

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

选中此Route with Two optional parameters in MVC3 not working

答案 1 :(得分:1)

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