@ Url.Action(“Action”,“Controller”)返回“/ cgi-bin?action = Action& controller = Controller”

时间:2016-08-15 23:34:18

标签: asp.net-mvc

出于某种原因,它认为目标是Apache服务器 - 我怀疑?

MVC是V5.2.3,其依赖性是nuget正确的 。我搜索并搜索无济于事。

修改 代码只是@Url.Action("Action", "Controller")

所以我创建了一个全新的MVC项目并使用完全相同的代码返回了正确的代码

http://localhost:53143/Controller/Action

编辑2 我删除了我的web.config文件,因为问题不存在。

1 个答案:

答案 0 :(得分:0)

我与专家联系,他看了看项目并回答如下。

(顺便说一下,我在路线中有' 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 ...现在,这个方法的作用是:

  1. 检索当前网址,包括控制器,操作,区域......
  2. 添加或替换您指定的参数
  3. 找到最匹配的路线! < ==
  4. 如果有任何路径变量 - 将提供的参数推送到这些变量中。
  5. 将其余参数粘贴到查询字符串< ==
  6. 我刻意强调了第3点和第3点。 5,第3点是最重要的。因此,UrlHelper.GetUrl(以及分别为Url.Action和Html.BeginForm)需要一个路线,并搜索可用的路线以找到第一个匹配。

    现在,这里出现了你的混合webforms-mvc应用程序的问题 - 当你纯粹与MVC打交道时,这个问题不存在:你正在使用MapPageRoute!请注意,它与MapRoute不同。 MapPageRoute使用PageRouteHandler类创建路径,而MapRoute使用MvcRouteHandler类,因为PageRouteHandler创建路径的方式总是与UrlHelper.GetUrl(" ActionName"," ControllerName"),将操作名称和控制器名称作为参数投入查询字符串(第5点)。

    所以,你的设置会发生什么,Url.Action正在搜索一条路线并且正在击中MapPageRoute创建的第一条路线,在你的情况下,这是:

    routes.MapPageRoute(" cgi-bin"," cgi-bin / {* theRestcgi-bin}","〜/ home / Search.aspx&#34 );

    查询字符串的神秘cgi-bin部分来自哪里,给人的印象是框架实际上是在搜索某个虚拟/物理文件夹。

    至于正确的解决方案:要么定义合适的路线,要么将url指定为一个简单的字符串。我认为,您的解决方案更好,因为您不必在RouteConfig类中移动路径定义。