3

当我进入我的主页时

http://localhost:5119/  

它重定向到

http://localhost:5119/Home

(这就是在我的浏览器 url 栏中显示的内容,我希望它不显示 /Home)

我知道这是我的默认路由所在,但我不知道是什么导致我的 URL 行在浏览器中被重写。当您转到基本 URL 时,Visual Studio 2012 中的默认示例不存在此问题。我附上了我的路线调试的图片(这似乎对我没有帮助,但可能有一些价值)。

谢谢,-彼得

之后添加这个。它是路线代码的相关部分

        // HOME
        int currentYearInt;
        Int32.TryParse(currentYear, out currentYearInt);
        routes.MapRoute("HomeRouteAll", "Home/{yearInt}",
                  new
                  {
                      /* Your default route */
                      controller = "Home",
                      action = "Index"
                  });



        // DEFAULT ROUTE
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

在此处输入图像描述

4

1 回答 1

1

您之所以看到这一点,是因为Home/{year}默认路由上方的路由具有{year}参数的默认值。

路由引擎做出以下决定:

  1. 从路线列表顶部开始
  2. 寻找与您的路线值相匹配的东西(controller = "Home", Action="Index")。
  3. 在第一次匹配时,返回,这就是你的 URL。

由于您有一个匹配的控制器 (Home) 和操作 (Index) 以及year 参数的默认值,因此路由引擎与路由匹配Home/{year},因此给出了 url http://domain.com/Home

快速修复将是 a) 使 year 没有默认值 ( Home/2013),b) 将所有内容移至不同的控制器 ( NewName/{year}),c) 将其移至不同的操作 ( NewIndex/{year}) 或 d) 将您的默认路由更新为使用年份参数而不是 id

routes.MapRoute(
                "Default",
                "{controller}/{year}/{action}",
                new {controller = "Home", action = "Index", year = 2013});

编辑

我不确定您在路由定义中的 tryParse 内容,但在我的测试中,这似乎完成了您想要做的事情:

routes.MapRoute(
                name: "Test",
                url: "Home/{year}",
                defaults: new { controller = "Home", action = "Index"}, 
//this line causes the year to be an integer
constraints: new { year = @"\d+" }
                );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

行为:

http://domain.com/ -> 调用 Home 控制器,索引操作,年份参数为空值(不重定向到 Home/2013)

http://domain.com/Home/2010 -> 调用 Home Controller,使用 2010 作为 year 参数的 Index 操作

http://domain.com/Home/ -> 调用 Home Controller,索引操作,年份为 null。

如果您在两个路由中的第一个中定义默认年份,那么转到http://domain.com/Home将调用 Home 控制器,该年份的索引操作为 2013,并且重定向仍然不会发生。

最后,我怀疑您的 Home/Index 操作看起来像这样:

public ActionResult Index(int year){...}

如果当您点击 Home/Index 操作时,您希望自动填充 2013,然后将您的 int 更改为可为空的参数并在那里执行而不是路由。

public ActionResult Index(int? year){
    if(!year.hasValue){
        year = 2013;
    }

通过在此处执行此逻辑而不是路由,您应该防止重定向到 Home/,因为您没有匹配的{year}参数。

于 2013-04-19T20:50:13.077 回答