MVC控制器的Index有时会出现404错误?

5

我已经添加了3个控制器,其中一个控制器的默认Index视图无法工作。

Works(shows index):
http://localhost:1767/Employees/  
http://localhost:1767/Employees/Index
http://localhost:1767/Home/       
http://localhost:1767/Home/Index
http://localhost:1767/
http://localhost:1767/Companies/Index

Doesn't work(gives 404 error):
http://localhost:1767/Companies/  

1)我创建了一个实体框架类库,从包含员工和公司表的数据库生成。

2)创建一个MVC 3空项目。

3)从MVC项目添加对EF类库项目的项目引用。

4)添加一个控制器,在添加控制器对话框中选择EF模型和其中一个表,并将控制器命名为CompaniesController。

5)然后我想起我需要一个HomeController,所以我添加了另一个控制器,将其命名为HomeController,并再次选择了Companies实体。

6)最后,我添加了一个EmployeesController,选择了Employees实体。

这是我的Global.asax.cs中唯一的路由:

routes.MapRoute(
          "Default", // Route name
          "{controller}/{action}/{id}", // URL with parameters
          new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults

为什么http://localhost:1767/Companies/的URL不像其他控制器一样默认到索引操作?我做了几个MVC练习项目,似乎总是遇到这个问题。即使没有路由告诉它这样做,员工控制器默认索引也可以正常工作。
编辑:这是我收到的错误信息:
The resource cannot be found.
Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly.

Requested URL: /Companies/

编辑:通常我在网上发布示例时不会透露实体或域详细信息的名称,但在这种情况下,公司实际上被称为属性,将名称更改为Properties2以供视图文件夹和控制器使用可以解决问题。因此,如果URL中出现“属性”,它似乎是一种特殊关键字,会破坏默认的索引。
4个回答

5

将视图文件夹和控制器从 Properties(Controller) 更改为 Properties2(Controller),现在可以正常工作了。显然,“Properties”在URL中有一些特殊处理,会破坏默认的索引设置。


我认为可能是因为Properties是包含AssemblyInfo.cs(项目模板)的标准文件夹。它应该是4XX错误消息,不确定为什么你收到了404。 - Lokeshwer
太棒了...我正好遇到了这个问题。 - Red Nightingale
糟糕,我有一个Views/Views文件夹和一个ViewsController。如果您在URL中键入Views/Index,它可以工作,但是单独的Views则不行。更改为MapViews,一切正常。感谢您的提醒。 - GeoffM

3

你是否在CompaniesController中添加了Index操作?

[HttpGet]
public ActionResult Index()
{
    return View();
}

另外,请确保在Views/Companies文件夹中有一个Index.cshtml或Index.aspx(无论您使用哪种视图引擎)。 - Rodrigo Caballero
是的。我一直让“添加控制器”对话框为我完成所有的脚手架工作,但我确实验证了存在一个public ViewResult Index() - AaronLS

3

我收到了403.1错误,因为我的Web项目根目录下有与控制器名称相同的文件夹名称。因此,在它达到MVC路由解析之前,它尝试列出文件夹内容就失败了。在任何项目中,属性可能也存在类似的标准文件夹问题。


我遇到了描述中的404错误,但问题是这样的 - 我有一个名为DevelopmentController.cs的控制器,并且还有一个名为Development的目录。将目录名称更改为Dev,问题解决了! - Eraph

2

您的Views文件夹下是否有名为Companies的Index视图?即Views/Companies/Index.aspx?

根据提供的信息,我唯一能想到的原因是拼写错误、Companies控制器没有继承控制器或实现IController接口,或者在Views/Controller文件夹中缺少Index操作的视图。

编辑:以下是我期望的CompaniesController样式:

namespace MyProject.Controllers

public class CompaniesController : Controller
{
     [HttpGet]
     public ActionResult Index() {
         return View();
     }
}

它将驻留在您项目的 Controllers 文件夹中。


是的,有一个Index.cshtml文件。我让“添加控制器”对话框为我完成所有脚手架工作,所以不知道它如何正确地获取其他操作但拼错了Index。 - AaronLS
你能否发布出现的错误摘要,比如是否显示无法找到Index视图。搜索的文件夹包括Views/Index、Views/Shared等。 - dreza
只是为了确认一下。你的控制器(文件和类)叫做CompaniesController而不是CompaniesControllerController。这是我曾经犯过的错误,花了我很长时间才找到它。 - dreza
我认为出错与控制器和/或操作未找到有关。但是根据您所说的,这似乎都已经就位了。 - dreza
@AaronLS 让我们在聊天室里继续这个讨论 - dreza
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接