2013-01-12 155 views
0

所以我有這樣的控制器操作:ASP.NET MVC:路由問題

public ActionResult Categories(int typecode) 
{ 
    // code removed 
} 

這條路線:

routes.MapRoute(null, 
    "{controller}/{action}/{typecode}", 
    new { controller = "Search", action = "Categories", } 
); 

而這個鏈接調用路線:

@Html.ActionLink("Ga", "Categories", "Search", new { typecode = 16860 }, null) 

如果我使用這個,我的網址是:http://localhost:50033/Search/Categories?typecode=16860 但如果我將typecode的所有發生次數更改爲id,它的工作原理和我得到這個網址:http://localhost:50033/Search/Categories/16860

所以typecode我的路線不工作,並與id它。我究竟做錯了什麼?謝謝!

編輯:

我想我是不夠清楚,但在我Global.asax.cs文件我有這樣的:

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

    routes.MapRoute("TypeCode", 
    "Search/Categories/{typecode}", 
    new { controller = "Search", action = "Categories" } 
); 
} 

所以這是隻有一個路由,比我SearchController我有這個Categories action:

public ActionResult Categories(int typecode) 
{ 
    // Irrelevant code removed 
} 

所以參數和路由參數完全一樣,然後,我有此鏈接:

@Html.ActionLink("Ga", "Categories", "Search", new { typecode = 16860 }, null) 

而且使用完全相同的路線參數,但仍生成的鏈接是:http://localhost:50033/Search/Categories?typecode=16860所以這不是我想要的。

現在,當我更換所有類型代碼的出現次數,就像這樣:

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

    routes.MapRoute("TypeCode", 
    "Search/Categories/{id}", 
    new { controller = "Search", action = "Categories" } 
); 
} 

public ActionResult Categories(int id) 
{ 
    // irrelevant code removed 
} 

@Html.ActionLink("Ga", "Categories", "Search", new { id = 16860 }, null) 

它的工作原理!所以我取代的一切,沒有更多的路線,我只是用id取代3 typecode發生。

這是爲什麼?任何人都可以幫助我嗎?提前致謝!

+0

你想擁有哪個網址'/ Categories?typecode = {id}'或'/ Categories/{id}'? – James

+0

看看http://blogs.msdn.com/b/simonince/archive/2011/02/02/asp-net-mvc-3-optional-parameter-routing-issue.aspx –

+0

@James我想要'/類別/ {typecode}' – avb

回答

1

問題解決了。我會解釋任何有同樣問題的人出了什麼問題。

我在這個項目中使用ASP.NET MVC 4,之前我創建了一些MVC 3的網上商店。我總是這樣做,把路線放在Global.asax.cs文件中。現在,當我開始我的項目時,沒有RegisterRoutes()方法,所以我創建了一個並在其中放置了我的路線。剛剛我讀this後,它說MVC 4註冊其路線App_Data/RouteConfig.cs我檢出了該文件,並看到RegisterRoutes()方法與一個路由,默認一個與可選參數id

因此,這就是爲什麼它只以id作爲參數,MVC 4甚至沒有看到我的路線Global.asax.cs,只是從App_Data/RouteConfig.cs拿起唯一的路線。

我確實把我的路線在App_Data/RouteConfig.cs文件,它的工作原理!再次學習了一些東西,我很高興它終於有效。我還要感謝@詹姆斯幫助我。

+0

有道理,因爲它絕對不是默認路線。 +1爲搞清楚:) – James

+1

只需注意:從Global.asax Application_Start方法顯式調用RouteConfig.RegisterRoutes方法。如果您不想使用默認路由,您也可以刪除/註釋該行,或者如果您想在默認路由之前註冊任何路由,只需在該呼叫發生之前執行。 – peterfoldi

+0

我知道這一點,已經刪除了默認的;)。無論如何感謝您的關心! – avb

2

因此,typecode我的路線不工作,並與id它確實。我究竟做錯了什麼?

問題是你毫無疑問仍然有被映射的默認路由之前您的自定義路線即

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

這意味着類似的URL爲「控制器/操作/ ID」將匹配任何東西由默認路由解析,而不是您的自定義路由。事實上,此路線不會將typecode識別爲預期參數,這意味着它被視爲查詢字符串參數(因此爲?typecode=)。

如果你想拿起typecode更具體哪個控制器你想要映射它,並把這條路線之前默認的一個即

routes.MapRoute(
    "CategoryItem", 
    "{controller}/Categories/{typecode}", 
    new { controller = "Search", action = "Categories", typecode = UrlParameter.Optional } 
); 

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

這將限制其開始喜歡controller/Categories/任何網址,只接受typecode而不是id - 這將導致您的網址作爲形成Search/Categories/12345。如果您真的想要,您可以通過控制器進一步限制這一點(只需在路線中將{controller}替換爲Search)。

但是,我沒有看到任何真實這樣做的好處,考慮到你實際上並沒有在任何地方顯示typecode。我可以理解你是否想要顯示網址爲Search/Categories?typecode=12345,因爲它可能比id更具描述性。就我個人而言,我會保留默認路由,並將您的操作鏈接更改爲:

@Html.ActionLink("Ga", "Categories", "Search", new { id = 16860 }, null) 

它會給出相同的結果。

更新

根據您的更新,我能想到的是你是不是在路徑中指定一個默認值,因此也許它不是正確選擇參數的唯一的事,嘗試:

routes.MapRoute("TypeCode", 
    "Search/Categories/{typecode}", 
    new { controller = "Search", action = "Categories", typecode = "" } 
); 
+0

這不是真的,具有'{typecode}'的路由實際上在默認路由之前,它是第一條路由.. 。爲什麼不使用id?因爲typecode不是我要使用的唯一代碼,如果這個代碼可以工作,我還需要一個'menucode'和一個'partcode'等等,所以我不能使用id代替它們。那麼,爲什麼我的路線不工作,而它真的是第一條路線......即使是唯一的...... – avb

+0

詹姆斯請檢查我更新的問題,感謝您的時間。欣賞它。 – avb

+0

@ avb1994請參閱更新。 – James