2012-08-09 107 views
0

我有一个webforms 4项目,我使用url路由Webforms 4 url​​路由多个匹配

在某些情况下,给定的路线可以匹配多个模式。

似乎路由机制以特定顺序尝试每个模式,并停止在第一个匹配。 (纠正我,如果我错了)。如果所选模式的资源(主要是一个aspx文件)不存在,我们有一个404错误(资源不存在)。

下一个匹配模式映射到现有资源,但该机制不会尝试。

实施例(使用类似于对MVC命名约定)

routes.MapPageRoute("Action", "{controler}/{action}/{*pathInfo}", "~/Views/{controler}/{action}.aspx"); 
routes.MapPageRoute("Overview", "{controler}/{*pathInfo}", "~/Views/{controler}/Overview.aspx"); 

因此,有一个/Views/Patient/Overview.aspx和/Views/Patient/Search.aspx的文件系统上。

路线“/患者”将匹配所述第二图案和映射到“/Views/Patient/Overview.aspx

路线“/患者/搜索”将匹配第一图案映射到“/Views/Patient/Search.aspx

路线“/人/搜索/ SomePathInfo”将匹配第一图案和映射到“/查看/人/海rch.aspx “(治疗” SomePathInfo”的URL的一部分的{*} panthinfo一部分)

现在,问题是,路线 “/患者/ SomePathInfo” 两个图案相匹配。第一个将“SomePathInfo”视为{action}部分(搜索不存在的“/Views/Patient/SomePathInfo.aspx”)。第二个将“SomePathInfo”视为{* pathInfo}部分,并映射到现有的“/Views/Patient/Overview.aspx”。

该机制虽然尝试第一个,但它找不到SomePathInfo.aspx文件,并引发404错误。

我的问题是“有没有办法来引导机制,以尝试每个模式,直到它找到一个现有的资源(或者,更一般的,直到某些条件得到满足?[点击这里:resource.exists] “!

回答

0

一种解决方法,以上述我的问题是使用布线约束以及定义一组有限的可用值的{动作}占位符。这同样适用于{控制器}占位符等

所以我定义一个约束来仅接受列表中的动作:“索引”,“细节”,“添加”,“编辑”,“选择”等,以及控制器在“家”,“病人”,“事件”等列表中;

routes.MapPageRoute("Action", "{controler}/{action}/{*queryValues}", "~/Views/{controler}/{action}.aspx", true, 
      new RouteValueDictionary { // Default values 
       { "controller", "home"}, 
       { "action", "index"} }, 
      new RouteValueDictionary { // constraints 
       { "controller", "home|patient|incident"}, 
       { "action", "index|details|add|delete|edit|select"} }); 

这样,当我输入类似“患者/ somequery”中,“somequery”字符串不满足这种映射的约束,所以该机制continoues到下一个和对待“somequery”部分作为{* queryvalues}而不是{action}。

但问题仍然成立:

有没有办法来引导机制,以尝试每个模式,直到它找到一个现有的资源(或者,更一般的,直到某些条件得到满足[? here:resource.exists]