繁体   English   中英

MVC路由许多可选参数

[英]MVC Routing many optional parameters

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

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

  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 = null; filter2 = "foo"那么这就是场景:

  • 期待: ../filter1/{filter1}/filter2/{filter2} / ../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");
}

以下是一些相关问题:

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

或者,您可以创建动态构建路由的扩展方法,以实现路由值组合的每个排列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM