Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net MVC控制器操作导致404未找到错误_Asp.net_Asp.net Mvc - Fatal编程技术网

Asp.net MVC控制器操作导致404未找到错误

Asp.net MVC控制器操作导致404未找到错误,asp.net,asp.net-mvc,Asp.net,Asp.net Mvc,注意:这不是另一个问题的重复,因为我的第一页工作正常,是其他页面/操作不工作 到目前为止,我已经准备好了很多帖子,但没有一篇接近。当在我的开发盒上本地运行时,它工作得很好。在我复制到服务器后,我看到了问题。我的默认路由工作正常,我得到了预期的索引页 public ActionResult Index() { return View(); } 我的RouteConfig包含: routes.MapRoute( name: "AnnualFees", url: "{cont

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

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

public ActionResult Index()
{
    return View();
}
我的RouteConfig包含:

routes.MapRoute(
    name: "AnnualFees",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "AnnualFees", action = "Index", id = UrlParameter.Optional }
);
当我想要达到索引以外的任何内容时,就会出现问题。例如,此操作会导致404未找到错误:

public ActionResult renderForm()
{
    return PartialView("_formPanel");
}
同样,它在我的本地开发设备上也能正常工作。但是在服务器上,我得到请求的URL:/AnnualFees/renderForm404错误:找不到资源


更新

好的,做了更多的研究和尝试,我发现了一些东西,还有一些补充


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

因此,正如我在评论中所指出的,问题是您有一个文件夹,它下面是路由。如果您不提供路线的任何部分,请致电

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”。

可能重复的井,您需要正确设置IIS。目前,“www.mysite.com/AnnualFees”引用您的应用程序,并使用路由中的所有默认值,包括控制器。“www.mysite.com/AnnualFees/AnnualFees”也会产生同样的结果。可以在@Andrei找到您需要的安装程序。我不确定正确安装IIS是什么意思。此应用程序需要在现有网站下运行,因此必须在网站的/AnnualFees子文件夹中运行。我需要/AnnualFees作为应用程序的根目录,但它仍然需要访问该站点其他文件夹中的文件。@ConnieDeCinko,哦,好吧,我误解了你在找什么。将您的网站放在其中一个IIS文件夹下是可以的,请参阅下面关于如何避免重复的答案。如果您有多个映射路由,其中Visual Studio生成的默认路由是第一个,则也会发生这种情况。默认路线必须在最后登记。好的,现在我可以看到森林中的树木了。现在更有意义了。。。我正在调用子文件夹中控制器中的方法。所以我看到AnnualFees两次是正确的,一次是文件夹名,然后是控制器名。我还看到了由于页面是否使用尾随斜杠调用而产生的问题。因此,目前一切都已整理完毕,并按预期运行。