【问题标题】:MVC Tell one view to one use controller, and another view to use anotherMVC 告诉一个视图使用一个控制器,而另一个视图使用另一个
【发布时间】:2018-02-01 18:39:29
【问题描述】:

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

http://mydomain/Index , http://mydomain/Edit , http://mydomain/Admin , 等等……

我最初将我的默认 RouteConfig 修改为如下所示:

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

我有一个 Views/Home 文件夹,其中包含我的所有视图。

它就像一个魅力,所以每当我输入动作名称时,我都没有任何问题。

如果,假设,我想保持这个 url 结构相同,我只显示根域/操作页面......并且我想让其中一些操作使用一个控制器 (HomeController.cs) 和其他操作(例如管理员)使用另一个控制器(AdminController),有没有办法我可以修改我的路线说......好的..如果操作是“Admin”然后使用AdminController?我设置了 AdminController,并定义了“Admin”的操作。我尝试像这样更改我的路由配置:

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 文件夹

但它不起作用。 IF 我在家庭控制器中有一个“管理员”操作,它从家庭控制器触发。但我希望从 AdminController 触发该操作。请记住,我不仅要使用 ActionLinks 导航到这些页面,因此我不能只使用 Actionlink 并指定控制器。有些人会通过直接的 URL/书签访问链接。

如果我想保持这样的 URL 结构 (http://mydomain/Action),我 可以 将我的所有操作放入一个单独的控制器中,这样就可以了,但我希望我的代码保持整洁,所以一个控制器处理与一组模型相关的功能,另一个控制器处理与另一组模型相关的功能。现在看来,我要么必须(a)拥有一个越来越大的 MASSIVE 控制器,要么(b)我必须有一个更详细的路径来告诉 MVC 使用哪个控制器。

(顺便说一句,我不能使用查询字符串...长篇大论...不要问)

据我所知,MVC 旨在让人们更好地控制布局。我从事 Web 表单程序员已有 13 年了,但到目前为止,MVC 似乎以牺牲您在其他领域的控制权为代价来做到这一点。

【问题讨论】:

  • 不,您不能(除非您为每个操作创建了特定的路由定义)。如果您没有在 url 中识别控制器(或它的别名),那么服务器如何知道要调用哪个控制器 - 它不是通灵的!
  • 为每个操作创建特定路线是我会尝试的解决方案(例如在下面的答案之一中)。

标签: asp.net-mvc asp.net-mvc-routing


【解决方案1】:

您可能需要在路由中硬编码您的操作名称。

        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 }
        );

http://localhost/Admin 应该带您进入管理/索引视图,http://localhost/Home 应该进入主页/索引视图

【讨论】:

  • 果然成功了。我想知道如果我为不同的控制器使用相同的动作名称,它将如何(或是否)工作。我怀疑它会起作用,但幸运的是,这不是我的情况。我所有的动作名称在所有控制器中都是唯一的。这种方法唯一要记住的是,在默认情况下,必须指定“action = 'actionname'”,并且必须与 URL 中设置的操作名称匹配,否则会出现“未找到研究”错误。跨度>
  • 我知道这种方法可能看起来很奇怪,但我不喜欢 MS 如何将其 URL 命名约定强加给您。在使用 webforms 14 年多之后,最近在过去的 2 年里强迫自己转向 MVC,这是我唯一真正的抱怨。并非每个网站都是您真正希望遵守 SEO URL 约定的在线商店。有些人希望对自己的 URL 有更多的控制权。
  • 如果您深入研究路由,您可能会惊讶于它的真正灵活性。要记住的一件事是始终有一条默认路线通向某处并将其放在列表的最后。 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
【解决方案2】:

一个简单的解决方法是在主控制器中创建一个 admn 操作,然后从那里重定向到管理控制器,但我不确定你是否想要这样做,因为它可能会影响性能

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

如果可以的话,我会说尝试其他方法,即使那样,如果你找不到出路,请使用此解决方法

【讨论】:

  • 这实际上是我脑海中闪现的第一件事。 routeconfig.cs 文件中的硬编码操作名称似乎起到了作用,至少从组织的角度来看,这似乎是一种更清洁的方法。我可能需要做一个实验,看看从执行时间来看哪种方法实际上更有效立场。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
相关资源
最近更新 更多