我正在将我们的网站从糟糕的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控制器中。所以只需要删除一条路线就行不通了。我们的目标网页有很多控制器。
答案 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