1

我需要以下路線:ASP.NET MVC路由:與查詢字符串到一個動作,而無需到另一個

example.com/products
都到了產品類別頁面(如汽車,卡車,公交車,自行車)
控制器= Products,動作= Categories()

example.com/products?a=1&b=2
進入的所有產品中的特定類別(例如福特,本田,雪佛蘭)
控制器的索引= Products,動作= Index(string a, string b)

的路由僅在查詢字符串不同,它似乎是MVC忽略「?」後的任何東西。所以當然只有一條規則會被擊中 - 第一條。

如何區分這兩者?

編輯:換句話說,我想兩條路線。是否有可能在路線中使用查詢字符串還是MVC真的忽略它?有什麼辦法來破解它,或者使用某種自定義路由方案,就像我可以做自定義綁定和自定義驗證一樣?

+0

對於不需要的URL,如果設置了&b,則可以返回正確的視圖,如果不是,則返回索引。爲什麼不區分象這樣的URL: 'example.com/products' 'example.com /產品/ A/B' 換句話說,你爲什麼要'了'和'B'是查詢參數而不是URL的一部分?如果你讓他們的URL的一部分,該路由很簡單:把複雜的路線(需要'了'和'B'第一)和不太複雜的路線秒。 – Cymen

+0

感謝,但不是我們在做什麼,因爲你是在編碼的路由本身短暫的數據,是一種資源;這就是查詢字符串的目的,它適當地格式化數據。至於你的第一個建議,是的,我們可以把所有的東西都放在一個動作方法中,然後在那裏決定返回什麼樣的視圖 - 但是我做了我自己的路由,看起來很愚蠢,我希望框架能夠做到這一點我。 – mvcstudent

+0

在stackoverflow上有更多關於此的討論。這可能是適當的:http://stackoverflow.com/questions/968904/asp-net-mvc-url-routing-vs-querystring – Cymen

回答

1

介紹參數。 ASP.NET MVC允許你創建 '漂亮' 的網址,而這正是你應該做的位置:

首先,路由映射:

routes.MapRoute(
    "SpecificProducts", 
    "products/{a}/{b}", 
    new { controller = "products", action = "Categories" } 
    ); 

routes.MapRoute(
    "ProductsIndex", 
    "products". 
    new { controller = "products", action = "Index" } 
    ); 

然後,控制器動作

public ActionResult Index() 
{ 
} 

public ActionResult Categories(string a, string b) //parameters must match route values 
{ 
} 

這將允許你使用一個搜索友好的URL,你不必擔心查詢字符串參數。

+0

感謝您的意見。我們可以用查詢字符串參數來做嗎?這是做「恕我直通」的「適當」方式。路線應該忽略數據的格式。我曾多次遇到過類似的問題,似乎MS路由人員在這裏沒有做好設計工作。 – mvcstudent

+0

@mvcstudent:這不是ms設計失敗。只需處理您的操作中可以爲空的參數,並且一切正常。只使用一條路線並將A和B設置爲「可選參數」。 – Iridio

+0

但是,這仍然沒有回答這個問題 - 是否有可能有兩個路線的上述情況?除了使用自定義模型綁定器,因此由於框架限制而將其分開,並不理想。 – mvcstudent

相關問題