.NET MVC3路由 - 为什么这么混乱?

时间:2012-07-09 20:30:53

标签: asp.net-mvc-3 url-routing asp.net-mvc-routing

我不知道为什么我一直在努力解决这个问题,但有人能解释为什么这不起作用吗?

/重定向到index控制器的home操作。

/gallery/会抛出404未找到的错误。

/gallery/index重定向到index控制器的gallery操作。

来自documentation

  

定义路径时,可以为参数指定默认值。如果URL中未包含该参数的值,则使用默认值。您可以通过将字典对象分配给Route类的Defaults属性来设置路由的默认值。

我不明白这是如何遵循这条规则的:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
        );
    }

对我而言:

  • 如果未定义controller,请使用Home
  • 如果未定义action,请使用Index
  • 输入的网址包含控制器= gallery,网址中未包含操作,因此应该转到Index

我是否遗漏了某些不必要的混淆和愚蠢的东西?

我总是发现MVC3路由有问题,但接受了它。然后我开始使用Rails和Node框架,他们有简单的路由,所以现在.NET MVC只是在它不起作用时让我烦恼或者让我使用复杂的模式。

如有人要求参考,我浏览/gallery/index时,我的图库控制器,操作和视图都已定义并正常工作。

public class GalleryController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

2 个答案:

答案 0 :(得分:5)

你肯定应该做错事,或者有些代码没有向我们展示过。执行以下步骤:

  1. 使用默认向导( Internet Application )创建新的ASP.NET MVC 3应用程序
  2. HomeController.cs的内容替换为:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return Content("home/index");
        }
    }
    
    public class GalleryController : Controller
    {
        public ActionResult Index()
        {
            return Content("gallery/index");
        }
    }
    
  3. 点击 F5

  4. 以下是发生的事情:

    requested url    |   result
    -----------------+---------------
    /                |   home/index
    /home            |   home/index
    /home/           |   home/index
    /home/index      |   home/index
    /home/index/     |   home/index
    /gallery         |   gallery/index
    /gallery/        |   gallery/index
    /gallery/index   |   gallery/index
    /gallery/index/  |   gallery/index
    

    正如预期的那样,不是吗?

答案 1 :(得分:1)

问题是我有一个隐藏目录(未包含在我的解决方案中),其名称与我的错误路由相同:/gallery

幸运的是,今天早上我太累了,不能打开显示器。

感谢大家的建议,所有人都给了+1,以获得有用的指导。

PS。为了帮助我调查问题,我使用了Phil Haack's routing debugger