我正在一个网站上,该网站将能够根据用户选择来过滤项目列表,就像您可以过滤亚马逊搜索的结果一样。我不确定如何建立一个可以接受许多不同参数的路由,而这些参数都不是必需的。

理想情况下,最终结果将类似于:



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



要么



  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/{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");
}


以下是一些相关问题:


Designing a REST api by URI vs query string
REST API Best practices: Where to put parameters?

关于c# - MVC路由许多可选参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44268669/

10-11 13:25