MVC 路由的许多可选参数

MVC Routing many optional parameters

我正在开发一个能够根据用户选择过滤项目列表的网站,就像您可以过滤亚马逊搜索的结果一样。我不确定如何构建可以接受许多不同参数的路由,其中​​ none 是必需的。

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

  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/{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 个以上的参数,我建议为过滤器创建一个 class。例如:

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 时。

或者,您可以以实现路由值组合的每个排列。