MVC路由许多可选参数

时间:2017-05-30 17:44:23

标签: c# asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing optional-parameters

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

理想情况下,最终结果如下:

  1.   

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

    1.   

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

    2. 对于这两个方面,我不了解如何设置路由来处理随机过滤器/随机排序过滤器。

      目前我的代码只是:

      //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 个答案:

答案 0 :(得分:2)

当您离开过滤器时它没有点击您的操作的原因是因为您将过滤器作为路线的一部分。

如果您有../filter1/{filter1}/filter2/{filter2},则情况如下:

  • 期待: ../filter1/filter2/foo
  • 实际: [Route("DoThings")] public IActionResult DoThings(string filter1 = null, string filter2 = null) { return Ok("Test"); }

相反,您应该使用查询参数。然后查询将如下所示:

  

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

路线看起来像:

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

此外,由于您提到这将有10个以上的参数,我建议为过滤器创建一个类。例如:

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

user

以下是一些相关问题:

答案 1 :(得分:1)

正如@fqhv所指出的,你的第一选择应该是使用查询字符串参数。它们不是路线的一部分,因此无论如何都会匹配您的路径,并且可以以任何组合和任何顺序提供。这种方法可能无效的唯一情况是,当您尝试制作用户或搜索引擎友好的URL时。

或者,您可以设置extension methods that dynamically build routes以实现路径值组合的每个排列。