【问题标题】:MVC controller action causing 404 not found errorMVC 控制器操作导致 404 未找到错误
【发布时间】:2016-11-10 05:57:57
【问题描述】:

注意:这不是另一个问题的重复,因为我的第一页可以正常工作,而是其他页面/操作无法正常工作。

到目前为止,我已经准备了很多帖子,但没有什么能接近。当在我的开发盒上本地运行时,这工作得很好。复制到服务器后,我看到了问题。我的默认路由工作正常,我得到了预期的索引页面。

public ActionResult Index()
{
    return View();
}

我的 RouteConfig 包含:

routes.MapRoute(
    name: "AnnualFees",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "AnnualFees", action = "Index", id = UrlParameter.Optional }
);

当我想要访问 Index 以外的任何内容时,就会出现问题。例如,此操作会导致 404 not found 错误:

public ActionResult renderForm()
{
    return PartialView("_formPanel");
}

再次,在我的本地开发盒上正常工作。但是在服务器上我得到 Requested URL: /AnnualFees/renderForm 404 error The resource cannot be found.


更新

好的,做更多的研究和反复试验,我发现了一些东西,还有一点要补充。

此应用程序在 IIS 中的当前网站下运行,我在该网站根目录下创建了一个虚拟文件夹/应用程序。如果我导航到 www.mysite.com/AnnualFees,我会按预期获得 MVC 应用程序的第一页。但是,我可以在我的 AnnualFeesController 中执行任何其他操作的唯一方法是,我必须将控制器名称加倍,例如 www.mysite.com/AnnualFees/AnnualFees/renderForm,它可以工作但很难看而且不太正确。我怎样才能摆脱冗余?

【问题讨论】:

  • 好吧,你需要正确设置 IIS。目前,“www.mysite.com/AnnualFees”引用了您的应用程序,并使用您的路由中的所有默认值,包括控制器。 “www.mysite.com/AnnualFees/AnnualFees”将产生相同的结果。可以找到你需要的设置here
  • @Andrei 不确定正确设置 IIS 是什么意思。此应用程序需要在现有网站下运行,因此必须在该网站的 /AnnualFees 子文件夹中运行。我需要 /AnnualFees 作为应用程序的根目录,但它仍然需要访问站点其他文件夹中的文件。
  • @ConnieDeCinko,哦,好吧,我误解了你在找什么。将您的网站放在 IIS 文件夹之一下是可以的,请参阅下面有关如何避免重复的答案
  • 如果您有多个映射路由,Visual Studio 生成的默认路由作为第一个映射路由,也会发生这种情况。该默认路由必须最后注册。

标签: asp.net asp.net-mvc


【解决方案1】:

因此,正如我在评论中指出的那样,问题在于您有一个文件夹,并且在它下面有路径。如果您不提供路线的任何部分,只需调用

www.mysite.com/AnnualFees

这将使用您的路由配置中指定的所有默认值,并且您将获得默认页面。但是,如果您键入

www.mysite.com/AnnualFees/ActionName

MVC 将其视为控制器 ActionName 并且没有提供任何 id 的操作。这在您的应用中不存在,因此出现错误。

这里的根本问题是网站不应该存在于文件夹下,它们应该存在于顶级域下。也就是说,站点根 URL 不应该是www.mysite.com/AnnualFees,它应该只是www.mysite.com。但是,如果您的主控制器和 IIS 文件夹没有相同的名称,即使这样也没有问题,会产生不必要的重复。

但是,您可以更改您的路线以使AnnualFees 成为默认控制器。只需像这样删除控制器部分:

routes.MapRoute(
    name: "AnnualFees",
    url: "{action}/{id}",
    defaults: new { controller = "AnnualFees", action = "Index", id = UrlParameter.Optional }
);

现在应该可以使用了

www.mysite.com/AnnualFees/ActionName

再次注意,在上述 URL 中,“AnnualFees”不是控制器名称,它实际上对 MVC 应用程序根本不可见。

但是有一个警告。想象一下,您需要添加另一个控制器。现在默认且唯一的路由将无法使用它。关键是为这个控制器提供一个单独的路由,第一部分是硬编码的

routes.MapRoute(
    name: "NewControllerRoute",
    url: "NewControllerName/{action}/{id}",
    defaults: new { controller = "NewController", action = "Index", id = UrlParameter.Optional }
);

确保将此路由放在默认路由之前,以便所有到此控制器的请求都正确路由,而所有其他请求都转到“AnnualFees”。

【讨论】:

  • 好的,现在我可以只见树木不见森林了。现在更有意义了......我正在调用一个位于子文件夹中的控制器中的方法。所以我看到AnnualFees 两次是正确的,一次是文件夹名称,然后是控制器名称。由于页面是否以斜杠调用,我也看到了问题。因此,现在一切都已整理好并按预期工作。
猜你喜欢
  • 2015-12-27
  • 2013-04-07
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多