簡體   English   中英

MVC路由許多可選參數

[英]MVC Routing many optional parameters

我正在開發一個能夠根據用戶選擇過濾項目列表的網站,就像您可以過濾亞馬遜搜索的結果一樣。 我不確定如何構建一個可以接受許多各種參數的路由,其中​​不需要任何參數。

理想情況下,最終結果如下:

  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它根本不會觸及我的動作。

這種要求是否有共同的方法?

當你離開過濾器時它沒有點擊你的動作的原因是因為你有過濾器作為路線的一部分。

如果你有filter1 = null; filter2 = "foo" filter1 = null; filter2 = "foo"那么這就是場景:

  • 期待: ../filter1/{filter1}/filter2/{filter2} / ../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");
}

以下是一些相關問題:

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

或者,您可以創建動態構建路由的擴展方法,以實現路由值組合的每個排列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM