Asp.net mvc MVC告诉一个视图使用一个控制器,另一个视图使用另一个控制器

Asp.net mvc MVC告诉一个视图使用一个控制器,另一个视图使用另一个控制器,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,我有一个不想使用任何“文件夹”的应用程序。乙二醇 ,, , , 等等 我最初修改了我的defauly RouteConfig,使其看起来像这样: routes.MapRoute( name: "maproute1", url: "{action}/{id}", defaults: new { controller = "Home", id = UrlParameter.Optional } ); routes.MapRoute( name: "maproute1",

我有一个不想使用任何“文件夹”的应用程序。乙二醇

,, , , 等等

我最初修改了我的defauly RouteConfig,使其看起来像这样:

routes.MapRoute(
   name: "maproute1",
   url: "{action}/{id}",
   defaults: new { controller = "Home", id = UrlParameter.Optional }
);
routes.MapRoute(
   name: "maproute1",
   url: "{action}/{id}",
   defaults: new { controller = "Home", id = UrlParameter.Optional }
);

routes.MapRoute(
   name: "maproute2",
   url: "{action}/{id}",
   defaults: new { controller = "Admin", id = UrlParameter.Optional }
);
我有一个包含所有视图的视图/主文件夹

它就像一个符咒,所以每当我输入actionname时,我没有任何问题

假设,如果我想保持这个url结构不变,只显示根域/操作页面。。。我想让其中一些操作使用一个控制器(HomeController.cs),而其他操作(例如Admin)使用另一个控制器(AdminController),我有没有办法修改我的路由,说。。。好啊如果操作是“Admin”,那么使用AdminController?我已将AdminController设置为定义了“Admin”操作。我试着像这样改变我的路线图:

routes.MapRoute(
   name: "maproute1",
   url: "{action}/{id}",
   defaults: new { controller = "Home", id = UrlParameter.Optional }
);
routes.MapRoute(
   name: "maproute1",
   url: "{action}/{id}",
   defaults: new { controller = "Home", id = UrlParameter.Optional }
);

routes.MapRoute(
   name: "maproute2",
   url: "{action}/{id}",
   defaults: new { controller = "Admin", id = UrlParameter.Optional }
);
然后我为管理员视图(以及我想要的一些其他操作/视图)设置了一个Views/Admin文件夹

但它不起作用。如果我在主控制器中有一个“管理”操作,它将从主控制器触发。但我想从管理员控制器触发操作。请记住,我不会仅仅使用Actionlink导航到这些页面,所以我不能仅仅使用Actionlink并指定控制器。有些人将通过直接URL/书签访问链接

如果我想保持我的URL结构像这样(),我可以把我所有的动作放在一个控制器中,这样就可以工作了,但是我想保持我的代码整洁,这样一个控制器可以处理与一组模型相关的功能,而另一个控制器可以处理与另一组模型相关的功能。现在看来,我要么(a)有一个巨大的控制器,它将变得越来越大,要么(b)我必须有一个更详细的路径,在那里有一些东西告诉MVC使用什么控制器

(顺便说一句,我不能使用查询字符串…说来话长…不要问)


据我所知,MVC旨在让人们对布局有更多的控制。我已经做了13年的web表单程序员,但到目前为止,MVC似乎是以牺牲您在其他领域的控制为代价来完成这项工作的

一个简单的解决方法是在home controller中创建admn操作,然后从那里重定向到Admin controller,但我不确定您是否要这样做,因为这可能会影响性能

public ActionResult Admin()
{ 
 return Redirect("Admin/Index");
}

如果可以的话,我会说尝试其他方法,即使找不到出路,也可以使用此解决方法。您可能需要在路线中硬编码操作名称

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

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

应将您带到“管理/索引”视图,并应转到“主视图/索引”视图

否您不能(除非您为每个操作创建了特定的路由定义)。如果您在url中没有识别控制器(或其别名),那么服务器如何知道要调用哪个控制器-它不是通灵的!为每一个动作创建一个特定的路线是一个我会尝试的解决方案(比如下面的一个答案)。我想知道,如果我对不同的控制器使用相同的操作名称,它将如何工作(或者是否工作)。我怀疑它会起作用,但幸运的是,这不是我的情况。所有我的操作名称在所有控制器中都是唯一的。这种方法唯一需要记住的是,在默认情况下,必须指定“action='actionname',并且必须与URL中设置的action name匹配,否则会出现“research not found”错误。我知道这种方法可能看起来很奇怪,但我不喜欢MS如何将URL命名约定强加给你。在使用webforms 14年多之后,最近两年我强迫自己转到MVC,这是我唯一真正的抱怨。并不是每个网站都是一个在线商店,你真的想遵守搜索引擎优化URL公约。有些人希望对他们的URL有更多的控制权。如果你深入研究路由,你可能会惊讶于它的灵活性。要记住的一件事是,始终有一条默认路线通向某个地方,并将其放在列表的最后<代码>routes.MapRoute(名称:“默认”,url:{controller}/{action}/{id}),默认值:new{controller=“Home”,action=“Index”,id=UrlParameter.Optional})