【问题标题】:What Causes the browser URL line to get filled with Route in MVC4 asp.net是什么导致浏览器 URL 行被 MVC4 asp.net 中的 Route 填充
【发布时间】:2013-04-19 18:32:08
【问题描述】:

当我进入我的主页时

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

【问题讨论】:

  • 这是奇怪的行为。它应该转到/。不确定它会帮助但发布您的路线。

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


【解决方案1】:

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

路由引擎做出以下决定:

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

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

快速解决方法是 a) 使年份没有默认值 (Home/2013),b) 将所有内容移至不同的控制器 (NewName/{year}),c) 将其移至不同的操作 ( NewIndex/{year}) 或 d) 更新您的默认路由以使用 year 参数而不是 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

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} 参数。

【讨论】:

  • 嗨,Tommy,我尝试了所有的门,最喜欢选择 A。我将我的家乡路线更改为 // HOME int currentYearInt; Int32.TryParse(currentYear, out currentYearInt); routes.MapRoute("HomeRouteAll", "Home/{yearInt}", new { /* 你的默认路由 */ controller = "Home", action = "Index" });但我仍然得到默认情况下它离开我的行为 .../Home
  • 顺便说一句,我不想​​更改我的默认路由,因为我指望它用于其他我没有明确说明的路由。
  • @PeterKellner 您能否出于格式原因在您的问题中发布这些内容?
  • 我一直想知道在 SO。这是正确的协议吗?我一直犹豫是否要更改我原来的问题,因为这样 cmets 和答案就不再有意义了。不过我会试试的。
  • 如果您的问题添加到讨论中,您可以编辑它。通常,我会使用两个星号并键入 EDIT 来帮助识别它是新信息
猜你喜欢
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
相关资源
最近更新 更多