2

我正在將我們的網站從蹩腳的CMS轉移到一個不錯的自定義編碼MVC網站的過程中。一切都順利到目前爲止,但我有一些路由問題。ASP.NET MVC 2.0簡單路由問題

我公司發出了很多營銷電子郵件和信件。在這些我們有用戶去着陸頁,所以我們可以跟蹤活動的做法,以及提供更多的信息。所以在一封信中,它會說「訪問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 } 
    ); 
} 

但它不解決我的問題。

我已經做了一些Google搜索,這一切都非常複雜的路由,並沒有真正適用。我對製作這種超級動態或任何東西並不感興趣。每次運行廣告系列時,我都沒有問題製作新路線。

我也應該注意到,並不是所有這些頁面都會在主控制器中。所以只是有一個路線刪除不起作用。我們的登陸頁面有很多控制器。

回答

4

我在http://pastie.org/1054360編輯了你的代碼。你必須把你的新路線放在默認路線之前。在路由時,哪條路由最匹配並不重要,匹配URL的FIRST路由會被調用。在您的示例中,http://domain.com/CPA2010首先匹配默認路由,因爲沒有指定限制。它尋找CPA2010控制器的索引操作。嘗試在這裏的代碼,它應該工作。

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

這工作d。非常感謝你。然而,我確實需要改變控制器來說回傳視圖(「CPA2010」);.當我確實返回查看(「〜/ Views/Home/CPA2010.aspx」);我收到一個錯誤,表示不允許。謝謝! – 2010-07-22 17:13:35

0

您的路線只需要路由到正確的操作,然後返回正確的視圖。換句話說,你可以有「www.OurSite.com/LandingPage」,並有該視圖的實際路徑是/首頁/的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控制器Index操作這。不是你想要的,如果你將這條路線移動到頂端,它將正確匹配並擺脫你的404

+0

我給這是一個嘗試,但它仍然是生產對我來說是404。 ( 我的路線是: routes.MapRoute( 「CPA2010Route」,//路線名稱 「CPA2010」,// URL與參數 新{控制器= 「家」,行動= 「CPA2010」} //參數默認 ); 和我的家庭控制器代碼是: 公衆的ActionResult CPA2010(){ 回報 視圖( 「〜查看/主頁/ CPA2010.aspx」);} 哦 – 2010-07-21 21:16:18

+0

上帝制造混亂的代碼,你也可以在這裏看到它:http://pastie.org/1054360 – 2010-07-21 21:18:35

+0

Duk:只是用代字符圍繞代碼 – abatishchev 2010-07-22 07:43:56

3

看起來你有兩個單獨的問題。

第一個是您添加路線時,順序很重要。

默認路由將逐字匹配每個請求到您的網站。由於它是首先添加的,而不是最後一個,所以不會檢查其他路徑。

一旦你掉那些路由的順序,你可能想要使用此: http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

所有你需要做的就是添加一個引用和一行代碼到你的Global.asax中,你會得到多少更好的信息工作。

但是,就像我上面提到的,直到最後添加默認路由,即使正確的路由也不會被執行。

3

看起來您在致電View()時遇到錯字。

嘗試:View("~/Views/Home/CPA2010.aspx")View("CPA2010")或只是View()