【问题标题】:@Url.Action("Action", "Controller") returns "/cgi-bin?action=Action&controller=Controller"@Url.Action("Action", "Controller") 返回 "/cgi-bin?action=Action&controller=Controller"
【发布时间】:2016-12-22 05:12:01
【问题描述】:

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

MVC 是 V5.2.3,它的依赖项是正确的,根据 nuget .我找了又找都没用。

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

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

http://localhost:53143/Controller/Action

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

【问题讨论】:

  • 您能否将生成错误输出的相关代码添加到问题中?

标签: asp.net-mvc


【解决方案1】:

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

(顺便说一句,我在路由中有“cgi-bin”,因为野外存在与我的域相关的旧 URL,这些 URL 以前托管在 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. 检索当前 URL,包括控制器、操作、区域...
  2. 添加或替换您指定的参数,
  3. 找到最佳匹配路线!
  4. 如果有任何路由变量 - 将提供的参数推送到这些变量中。
  5. 将其余参数粘贴到查询字符串中

我特意强调了第 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");

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-04
    • 2013-01-09
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2017-06-30
    • 2014-08-03
    • 2017-08-26
    相关资源
    最近更新 更多