我和一位专家取得了联系,他看了一下这个项目,并回答如下。
(BTW我有一个路线“的cgi-bin”,因为有旧网址在野外,涉及到Apache服务器和我不能改变先前被托管我的域名。)
的回答 我挖多一点到MVC佣工的源代码,当然,这两个问题(我有一个类似的问题Html.BeginForm with overload causes form action to be '/cgi-bin?action=Index&controller=Home' and so the HomeController is bypassed)是因为Url.Action相关和Html.BeginForm归结为调用同一个方法:UrlHelper.GetUrl ...现在,该方法所做的是:
- 检索当前URL包括控制器,动作,区域...
- 添加或替换您指定的参数,
- 寻找最佳匹配路线! < ==
- 如果有任何路由变量 - 将提供的参数推送到这些变量中。
- 棒,其余的参数为查询字符串< ==
我特意强调了3点& 5,与第3点是最重要的。因此,UrlHelper.GetUrl(分别为Url.Action和Html.BeginForm)需要一个路由,并搜索可用路径以查找第一个匹配。
现在,这里有您的混合的WebForms,MVC应用程序问题来了 - 当你纯粹用MVC处理中不存在一个问题:您正在使用的MapPageRoute!请注意,它与MapRoute不同。和的MapPageRoute使用PageRouteHandler类来创建路由,而图路线使用MvcRouteHandler类,它使所有的差异,因为PageRouteHandler以这样一种方式,它总是一个好匹配UrlHelper.GetUrl创建路线(“ActionName”,“ControllerName”)将操作名称和控制器名称作为参数引入查询字符串中(第5点)。
那么,什么与您的设置情况是,Url.Action正在搜索路线,是打的的MapPageRoute和你的情况建立的第一个是这样的:
routes.MapPageRoute(“CGI- bin“,”cgi-bin/{* theRestcgi-bin}“,”〜/ home/Search。ASPX“);
这就是查询字符串的那个神秘的cgi-bin一部分来自,给人的印象是框架实际上是在寻找一些虚拟/物理文件夹
至于适当的解决方案:要么。定义一个合适的路由或者按照你所做的方式将url指定为一个简单的字符串,我认为,你的解决方案更好,因为你不必在RouteConfig类中移动路由定义
你可以添加相关的代码产生错误的输出到问题? – Shyju