ASP.NET MVC 2.0简单路由问题

时间:2010-07-21 19:23:43

标签: asp.net-mvc model-view-controller asp.net-mvc-2 routing routes

我正在将我们的网站从糟糕的CMS转移到一个漂亮的自定义编码MVC网站。到目前为止,一切都进展顺利,但我遇到了一些路由问题。

我们公司发送了大量的营销电子邮件和信件。在这些用户中,我们让用户访问目标网页,以便我们可以跟踪广告系列的运作方式,并提供更多信息。因此,在一封信中,它会说“访问www.OurSite.com/LandingPage”。 但是,在MVC中,默认情况下,所有页面都放在其控制器的文件夹中。

所以说我的家庭控制器中有一个名为LP的页面,所以网址是www.OurSite.com/Home/LP

我需要的是它像以前一样成为www.OurSite.com/LP,所以我们目前正在运行的营销活动在我们推出新网站后不会给出404。另外,它输入更好,所以我们不会继续使用它。

基于此默认路线:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );
}

我尝试过这样的创作:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

    routes.MapRoute(
        "LandingPage",
        "{action}/{id}",
        new { controller = "Home", action = "LandingPage", id = UrlParameter.Optional }
    );
}

但它没有解决我的问题。

我已经完成了一些谷歌搜索,而且这些都是非常复杂的路由,并不适用。我真的不想制作这种超级动态或任何东西。每次我们开展活动时,我都没有问题。

我还应该注意,并非这些页面中的每个页面都在Home控制器中。所以只需要删除一条路线就行不通了。我们的目标网页有很多控制器。

4 个答案:

答案 0 :(得分:4)

我在http://pastie.org/1054360编辑了您的代码。您必须将新路线放在默认路线之前。路由时,哪个路由最匹配无关紧要,将调用与URL匹配的FIRST路由。在您的示例中,http://domain.com/CPA2010首先匹配默认路由,因为没有指定限制。它寻找CPA2010控制器的Index动作。尝试这里的代码,它应该工作。

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "CPA2010Route", // Route name
            "CPA2010", // URL with parameters
            new { controller = "Home", action = "CPA2010"  } // Parameter defaults
        );

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);
    }
}

答案 1 :(得分:3)

看来你有两个不同的问题。

首先,当您添加路线时,该顺序很重要。

默认路由将完全匹配您网站的每个请求。由于首先添加而不是最后添加,因此不会检查其他路径。

交换这些路线的顺序后,您可能想要使用此: http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

您所要做的就是在global.asax中添加一个引用和一行代码,您将获得更好的信息来解决问题。

但是,就像我上面提到的那样,在最后添加默认路由之前,即使正确的路由也不会被执行。

答案 2 :(得分:3)

您在View()的电话中看起来很乱。

尝试:View("~/Views/Home/CPA2010.aspx")View("CPA2010")View()

答案 3 :(得分:0)

您的路线只需要路由到正确的操作,然后返回正确的视图。换句话说,您可以拥有“www.OurSite.com/LandingPage”并将视图的实际路径设为/ Home / LandingPage。路线将是

routes.MapRoute(
        "CPA2010Route", // Route name
        "CPA2010", // URL with parameters
        new { controller = "Home", action = "CPA2010"  } // Parameter defaults
    );

然后在LandingPage操作中返回视图的路径:

public ActionResult CPA2010()
{
    return View("~/Views/Home/CPA2010.aspx");
}

您的默认路线需要按照路线定义的顺序排在最后,否则它将匹配此路线和所有其他路线。然后它将尝试将您引导至Home controller Index action,这不是您想要的。如果您将此路线移至顶部,它将正确匹配并摆脱您的404