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以实现路线值组合的每个置换。