控制器在Area中的URL太长,如何缩短URL?

时间:2016-11-18 21:07:58

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

我是MVC中区域术语的新手,我想使用它。我有以下目录指向区域中的控制器。

Areas > Admin > Controllers > AdminController

当我想访问AdminController的Index Action时,我需要访问http://localhost/Admin/Admin。我想摆脱第二个“管理员”。我只想输入http://localhost/Admin/。我怎么能这样做?

AdminAreaRegistration.cs具有以下MapRoute

public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional }
    );
}

1 个答案:

答案 0 :(得分:2)

您尚未为控制器指定默认值,因此除非您将其包含在网址中,否则路由引擎无法识别您要导航到的控制器。您可以通过为控制器名称

提供默认值来解决此问题
context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    new { controller = "Admin", action = "Index", id = UrlParameter.Optional }
);

虽然这意味着../Admin将导航到Index()的{​​{1}}方法,但仍然意味着如果您要导航到AdminController中的其他方法,那么您的网址需要AdminController,这可能不是你想要的。

区域的目的是对控制器和方法进行逻辑分组。例如,购物车应用可能有../Admin/Admin/AnotherMethod,用户可以在其中导航到ProductsController以显示产品列表,或../Product以显示产品的详细信息。但是应用可能需要其他方法供供应商创建和编辑他们的产品,因此您可以创建一个单独的../Product/Details/1区域,其中Suppliers将导航到他们的产品列表,../Suppliers/Products将允许他们更新其产品的详细信息。

../Suppliers/Products/Edit/1区域中设置AdminController并没有多大意义,如果它包含与管理任务相关的一般方法(以及路由定义),我建议它应该是Admin然后是HomeController