为什么这个MVC路由不起作用?

时间:2011-10-14 11:45:27

标签: c# asp.net-mvc model-view-controller asp.net-mvc-routing

        //standard routing
        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", 
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
        );

        //the custom route I added
        routes.Add(
           new Route("Fish/Image",

               new ImageHandlerRouteHandler()
           )
        );

我认为这会使用我的ImageHandlerRouteHandler,但我在Fish/Image得到的只是404。

3 个答案:

答案 0 :(得分:8)

在默认路线之前添加路线。

routes.Add(
           new Route("Fish/Image",

               new ImageHandlerRouteHandler()
           )
        );

//standard routing
        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", 
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
        );

请求映射到路由表中的第一个匹配路由。由于默认路由没有限制,因此会在自定义路由之前调用它。

答案 1 :(得分:3)

如果在默认路由之前有Fish/Image路由,则MVC构建链接中的问题是Fish / Image路由似乎满足所有请求。为了使这条路线有效,请按如下方式进行更改:

routes.Add(
    "FishImage",
    new Route(
        "{controller}/Image", 
        new RouteValueDictionary(new { controller = "Fish" }),
        new RouteValueDictionary(new { controller = @"^(?!fish).+"  }),
        null,
        new ImageHandlerRouteHandler() 
    ) 
);

这会改变路线,因此在链接建设方面,您的其他链接将无法通过此路线。目前,MVC认为它可以构建任何匹配此路由的链接,因此确实如此。使用受约束的路由,MVC现在将看到其他链接将失败此路由。

答案 2 :(得分:1)

路线显示的顺序很重要。首先添加您的路线,然后将默认值作为后退。