ASP.NET MVC通过字符串ID进行路由?

14

在ASP.NET 2中,如何创建一条路由规则来通过字符串id(例如ProductCode)查找对象(例如Product)?通过整数id(例如ProductId)查找同一个对象的路由是自动的,因此我不知道它是如何工作的。

根据id自动生成的路由为:

/Product/1

我该如何创建另一个使用字符串id的路由?

/Product/red-widget

我该如何做到两条路由都可用?

1个回答

20

您应该考虑使用路由约束来实现此操作。请参阅http://www.asp.net/mvc/tutorials/creating-a-route-constraint-cs

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="DetailsByName"},
    new {productId = @"\w+" }
 );
在上述代码中,约束条件正则表达式"\w+"应该只限制匹配只含有"word"字符的路由(请查看正则表达式文档了解更多关于此处使用的模式的详情)。

4
一定要将它放在默认路由之前,否则它永远不会被匹配。 - drneel
不幸的是,这会破坏我的几个自动路由,因为它们匹配正则表达式,例如/Product/List等。我需要在这个新路由之前添加一个List路由吗?我该如何创建基本路由?因为它们是自动的,所以我实际上不知道如何操作。 - JK.
1
是的,你必须按照匹配的第一个路由进行排序。默认路由匹配 {controller}/{action}/{id}。你可以明确列出此路由之前的路由,如 {controller}/list/ 或 {controller}/otherAction/{id},这些路由将首先匹配(仅当路径的第二个段为"list"或"otherAction"时)。 - craigb
对不起,它不起作用:/Product/1 与正则表达式匹配。\w + 是否包括数字? - JK.
我的错误,是的\w也匹配数字... http://www.regular-expressions.info/reference.html - craigb
尝试使用[a-zA-Z-_]+(其中最后的“-”和“_”可用作单词分隔符,或者您可以想出另一种模式,例如包括数字但必须以字母开头,如“[a-zA-Z]\w+”)。 - craigb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接