代码之家  ›  专栏  ›  技术社区  ›  bopapa_1979

用于未知数量可选参数的MVC处理程序

  •  3
  • bopapa_1979  · 技术社区  · 14 年前

    我正在一个MVC路由上工作,它将在URL的末尾接受未知数量的参数。像这样:

    domain.com/category/keyword1/keyword2/../keywordN

    这些关键字是我们必须匹配的过滤器的值。

    到目前为止,我唯一能想到的方法就是丑陋。。。只需制作一个ActionResult,它的参数比我可能需要的更多:

    { }

    这感觉不对。我想我可以把它们塞进一个querystring,但是我失去了我性感的MVC网址,对吧?有没有更好的方法来声明handler方法,以便它处理未知数量的可选参数?

    路由必须在应用程序启动时连接起来,这应该不会那么困难。关键字的最大数目可以很容易地从数据库中确定,所以没有什么大不了的。

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  6
  •   Kristof Claes    14 年前

    routes.MapRoute("Category", "category/{*keywords}", new { controller = "Category", action = "Search", keywords = "" });
    

    然后在搜索操作方法中有一个参数:

    public ActionResult Search(string keywords)
    {
        // Now you have to split the keywords parameter with '/' as delimiter.
    }
    

    http://www.example.com/category (关键字:“”)
    http://www.example.com/category/foo (关键词:“foo”)
    http://www.example.com/category/foo/bar (关键词:“foo/bar”)
    http://www.example.com/category/foo/bar/zap

        2
  •  1
  •   mare    14 年前

    您可以使关键字成为同一路由参数的一部分,并用破折号(-)连接它们。

    routes.MapRoute("Category", "category/{searchstring}", new { controller = "Category", action = "Search", searchstring = "" }, null));
    

    你可以这样构造你的网址:

    www.domain.com/category/cars-furniture-houses-apparel
    

    你可以在你的控制器动作中把它分开。

    不惜一切代价避免大量的参数。