路由中的自定义catch-all参数

时间:2009-05-08 00:12:27

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

我最近想要一个特殊的路由规则:{* whatever} / details / {Id} / {itemName}

我知道运行应用程序后会抛出异常。在我的应用程序中,例如我的网址格式为www.domain.com/root/parent/child /.../ child / details / 30 / itemname

但是当前的路由不支持这一点。如何自定义路由处理程序以使其工作?

3 个答案:

答案 0 :(得分:2)

已编写支持此

的类

我写过这样一个类,可以处理URL中任何位置的catch-all段。它有相当多的代码,但它按预期工作,我在现实生活中使用它。

Check it out yourself并查看它是否满足您的需求。

答案 1 :(得分:1)

问题是......怎么知道何时停止?

{* whatever}段将匹配:

/foo/
/foo/bar
/foo/bar/details/4/moreFoo
/foo/bar/andmore/details/4/moreFoo

因为catch-all参数包含任何内容,所以它永远不会停止。

实现此目的的唯一方法是为您使用详细信息的每个地点创建不同的路线...

例如:

games/details/{id}/{itemName}
widgets/details/{id}/{itemName}
books/details/{id}/{itemName}

当然,这已在默认的{controller} / {action} / {id}路由

中提供

答案 2 :(得分:1)

我认为您可能希望扩展System.Web.Routing.RouteBase类并重写GetRouteData()方法。有了它,您可以查看请求的URL并确定是否匹配您的模式,如果是,则构造并返回指向控制器的新实例RouteData以及您要处理请求的操作。否则,如果您与请求的URL不匹配,则返回null。

请参阅以下示例:

Pro ASP.NET MVC Framework By Steve Sanderson

Custom RouteBase