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



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

MVC是V5.2.3,它的依赖关系是正确的。我找了又找,还是没有用。

编辑代码就是@Url.Action("Action", "Controller")

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

http://localhost:53143/Controller/Action

编辑2 我去掉了我的网。

我联系了一位专家,他看了这个项目,回答如下:

(顺便说一句,我在路由中有'cgi-bin',因为在野外有旧的url,这些url与我以前在Apache服务器上托管的域有关,并且我无法更改。)

答案

我对mvc助手的源代码进行了更多的挖掘,是的,这两个问题(我有一个类似的问题Html。BeginForm与过载导致表单动作为'/cgi-bin?action=Index&controller=Home',因此Home控制器被绕过)是相关的,因为Url。动作和Html。BeginForm可以归结为调用同一个方法:UrlHelper.GetUrl…现在,这个方法的作用是:

  1. 检索当前URL,包括控制器,动作,区域…
  2. 添加或替换指定的参数,
  3. 找到最匹配的路线!& lt; = =
  4. 如果有路由变量-将提供的参数推入这些变量
  5. 将其余参数粘贴到查询字符串<==

我特意突出了第3点&5,第3点是最重要的。所以,UrlHelper。GetUrl(和Url。动作和Html。BeginForm(分别)需要一个路由,并在可用的路由中搜索以找到第一个匹配。

现在,你的混合webforms-mvc应用程序的问题来了-当你纯粹处理MVC时不存在的问题:你正在使用MapPageRoute!!请注意,它与MapRoute不同。MapPageRoute使用PageRouteHandler类来创建路由,而MapRoute使用MvcRouteHandler类,这是完全不同的,因为PageRouteHandler以这样一种方式创建路由它总是很好地匹配UrlHelper。GetUrl("ActionName", "ControllerName"),并将动作名称和控制器名称作为参数(第5点)抛出到查询字符串中。

在你的设置中发生的是那个Url。Action正在搜索路由,并且正在命中由MapPageRoute创建的第一个路由,在您的示例中,这是:

路线。MapPageRoute("目录"、"目录/{* theRestcgi-bin}"、"~/home/Search.aspx");

这就是查询字符串中神秘的cgi-bin部分的来源,给人的印象是框架实际上在搜索一些虚拟/物理文件夹。

至于正确的解决方案:要么定义一个合适的路由,要么像你所做的那样将url指定为一个简单的字符串。我认为,你的解决方案是更好的,因为你不需要在routecconfig类中移动路由定义。

相关内容

最新更新