C# 自定义MVC路由:更改控制器视图的位置

C# 自定义MVC路由:更改控制器视图的位置,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我有一个名为EmployeeController的控制器,所有视图都在/Employee中 我想创建一个路由,以便EmployeeController使用/Employees和/Employees/Add而不是/Employee和/Employees/Add 我一直在寻找有关如何更改路线以执行不同操作的文章,但我找不到任何方法来执行此操作。我认为您将视图与路线混淆了。ASP.NET MVC在很大程度上依赖于约定,在本例中,它使用路由的控制器组件并应用它来查找控制器。您可以定义新管线: route

我有一个名为EmployeeController的控制器,所有视图都在/Employee中

我想创建一个路由,以便EmployeeController使用/Employees和/Employees/Add而不是/Employee和/Employees/Add


我一直在寻找有关如何更改路线以执行不同操作的文章,但我找不到任何方法来执行此操作。

我认为您将视图与路线混淆了。ASP.NET MVC在很大程度上依赖于约定,在本例中,它使用路由的控制器组件并应用它来查找控制器。您可以定义新管线:

routes.MapRoute("Employees", "employees/{action}", new { 
    controller = "Employee",
    action = "Index" });

为什么不将EmployeeController重命名为EmployeesController?那你就不必弄乱路线了


当然,您还必须将“视图\员工”文件夹更改为“视图\员工”。

实际上,有两个不同的问题:

  • 第一个是关于路径映射的,我同意Matthew Abbott和Bugai13提出的简单解决方案
  • 第二个是关于“视图”文件夹约定和视图文件分辨率。如果需要一些自定义逻辑,可以继承
    ViewResult
    ,并更改它查找相应视图文件的方式。您还可以通过创建自己的
    IViewEngine
    或自定义现有视图中的一个,深入了解框架并调整视图的查找和实例化方式

不过,似乎您需要做的只是第一件事—只需使用URL模式提供更具体的路由映射,如
employees/{action}
,您就完成了。

matthew—如果您正在查看../questions->../questions/taged/asp.net-mvc等的SO结构,您会使用类似的路由约定吗。。。i、 e.“标记”控制器不位于“顶层”,而是由问题控制器作为父级。我有一段时间有点困惑,我认为重要的是要记住,实际上你根本不受
{controller}/{action}/{id}
路由结构的约束,这只是MVC路由的标准约定。在您的示例中,您可以在
questions/{id}/{name}/{comment}
之前定义
questions/taged/{tag}
,并且仍然具有完全有效的路由。