1

我正在一個網站上工作,該網站可以根據用戶選擇過濾項目列表,就像您可以過濾亞馬遜搜索的結果一樣。我不知道如何建立一個可以接受許多不同參數的路線,其中不需要任何參數。MVC路由許多可選參數

理想情況下,最終的結果看起來是這樣的:

  1. mysite.com/dothings/filter1/sometext/filter5/sometext/filter11/sometext

  1. mysite.com/dothings/filter1:sometext/filter5:sometext/filter11:sometext

對於這兩個,我不知道如何設置路由處理隨機過濾器/隨機過濾器的排序。

目前我的代碼就是:

//the real code would have 10+ filters 
[Route("filter1/{filter1}/filter2/{filter2}")] 
public IActionResult DoThings(string filter1 = null, string filter2 = null) 
{ 
    return Ok("Test"); 
} 

,但即使有可選參數,如果我離開了filter1它不打我的動作都沒有。

這種類型的需求是否有共同的方法?

回答

2

當你離開一個過濾器時,它不會打你的動作的原因是因爲你有過濾器作爲路線的一部分。

如果你有filter1 = null; filter2 = "foo"那麼這樣的情景:

  • 期待:../filter1/{filter1}/filter2/{filter2}
  • 實際:../filter1/filter2/foo

相反,你應該使用的查詢參數。那麼該查詢將是這樣的:

mysite.com/dothings?filter1=sometext & filter5 = sometext & filter11 = sometext

和路由的樣子:

[Route("DoThings")] 
public IActionResult DoThings(string filter1 = null, string filter2 = null) 
{ 
    return Ok("Test"); 
} 

也因爲你提到,這將有10多個參數,我會建議創建一個過濾器的類。例如:

public class MyFilters 
{ 
    public string filter1 { get; set; } 
    public string filter2 { get; set; } 
    ... 
} 

[Route("DoThings")] 
public IActionResult DoThings(MyFilters filters) 
{ 
    return Ok("Test"); 
} 

這裏有一些相關的問題:

1

由於@fqhv指出,你的第一選擇應該是使用查詢字符串參數。他們是而不是路線的一部分,因此無論如何都會匹配您的路線,並且可以以任何組合和任何順序提供。這種方法可能無法正常工作的唯一情況是您嘗試製作用戶或搜索引擎友好的網址。

或者,您可以製作extension methods that dynamically build routes以實現路線值組合的每個置換。