MVC Handler用于未知数量的可选参数

时间:2010-07-30 12:58:36

标签: asp.net-mvc url-routing asp.net-mvc-routing actionresult

我正在使用MVC路由,该路由将在URL的末尾获取未知数量的参数。像这样:

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

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

到目前为止,我能想到的唯一方法是UGLY ......只需创建一个ActionResult,其参数多于我可能需要的参数:

ActionResult CategoryPage(字符串urlValue1,字符串urlValue2,字符串urlValue3等...) { }

这感觉不对劲。我想我可以将它们塞进一个查询字符串中,但后来我丢失了性感的MVC URL,对吧?是否有更好的方法来声明处理程序方法,以便处理未知数量的可选参数?

必须在Application Start上连接路由,这应该不会那么难。关键字的最大数量可以很容易地从数据库中确定,因此没有大问题。

谢谢!

2 个答案:

答案 0 :(得分:6)

你可以使用像这样的catch-all参数:

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.
}

以下是可能的网址列表,其中包含keywords参数的值:

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(关键字:“foo / bar / zap”)

答案 1 :(得分:1)

您可以将关键字设置为相同路径参数的一部分,并使用短划线( - )将它们连接起来。 您的搜索路线将如下所示

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

您将构建您的网址,如下所示:

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

您可以在控制器操作中将其拆分。

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