【问题标题】:MVC Routing many optional parametersMVC 路由很多可选参数
【发布时间】:2017-10-31 07:23:40
【问题描述】:

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

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

  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 它根本不会影响我的操作。

对于此类要求是否有通用方法?

【问题讨论】:

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


    【解决方案1】:

    当您将过滤器排除在外时它不会触发您的操作的原因是您将过滤器作为路由的一部分。

    如果你有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");
    }
    

    以下是一些相关问题:

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-11-06
        • 2014-03-19
        • 1970-01-01
        • 2015-02-25
        • 2017-04-09
        • 2014-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多