2016-11-08 128 views
0

注意:这不是重复的另一个问题,因为我的第一页正常工作,这是其他页面/操作不起作用。MVC控制器操作导致404未找到错误

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

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/renderForm 404错误找不到资源。


UPDATE

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

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

+0

[在MVC网站上获取404错误]可能的重复(http://stackoverflow.com/questions/5068770/getting-404-error-on-mvc-web-site) –

+0

那么,你需要设置IIS正确。目前“www.mysite.com/AnnualFees”引用您的应用程序,并使用您的路线中的所有默认值,包括控制器。 “www.mysite.com/AnnualFees/AnnualFees”会产生相同的结果。你需要的安装程序可以在[这里]找到(http://serverfault.com/questions/68497/how-do-you-configure-iis-7-to-use-a-subdirectory-as-the-default-document) – Andrei

+0

@Andrei不知道你的意思是正确设置IIS。此应用需要在现有网站下运行,因此必须在网站的/ AnnualFees子文件夹中运行。我需要/ AnnualFees作为应用程序的根,但它仍然需要访问站点其他文件夹中的文件。 –

回答

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 

同样要注意的是,在上述网址“AnnualFees”不是一个控制器名称,它实际上是MVC应用根本不可见。

然而,有一个警告。想象一下,你需要添加另一个控制器。现在默认和唯一的路线将无法使用它。关键是要提供这个控制器的独立路线,用硬编码的第一部分

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

确保默认的一个前把这个路线,让这个控制器的所有请求被正确路由,所有的其他请求去到“AnnualFees”。

+0

好吧,现在我可以看到树木的森林。现在它更有意义......我正在调用位于子文件夹中的控制器中的方法。所以我看到AnnualFees两次是正确的,一次是文件夹名称,然后是控制器名称。我也看到问题,如果页面被称为一个结尾的斜杠或不。所以,现在所有人都按照预期进行整理和工作。 –