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

时间:2016-11-08 22:25:13

标签: asp.net asp.net-mvc

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

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

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错误无法找到资源。

更新

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

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

1 个答案:

答案 0 :(得分: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”。