属性路由继承
Attribute Routing Inheritance
我之前一直在我的 MVC 应用程序中使用这种方法
[Route("admin")]
public class AdminController : Controller
{
}
[Route("products")]
public class ProductsAdminController :AdminController
{
[Route("list")]
public IActionResult Index()
{
...
}
}
Url.RouteUrl() 返回 Index 操作 /admin/products/list/
现在在 .NET Core 中它忽略基本 class 路由属性,结果只是 /products/list/
这是 .NET Core 的新功能吗?是否有任何设置使系统可以组合 action + controller + base-controller 路由?
据我所知,那是行不通的。您可以使用 areas,并通过将 [Area]
属性应用于基本控制器,您将获得您描述的结果:
[Area("admin")]
public class AdminController : Controller
[Route("products")]
public class ProductsAdminController : AdminController
在 Core 中同样适用。
我找不到一种方法来组合action + controller + base-controller automatically,但是可以实现什么您正在寻找这样的:
[Route("admin")]
public class AdminController : Controller { }
public class ProductsAdminController : AdminController
{
[Route("products/list")]
public IActionResult Index()
{
...
}
}
这种方法最终会生成 /admin/products/list
的 URL,但明显的缺点是每个操作都需要重复 products
。这可能是一个可以接受的妥协;这由你决定。你可以用一个常量使它更好位,像这样:
private const string RoutePrefix = "products";
[Route(RoutePrefix + "/list")]
public IActionResult Index()
{
...
}
这不是很好,因为它只是一种解决方法,但如果您不想使用 ,则值得考虑 。
任何人仍在寻找在 .Net 核心 3.1 中定义“baseURL/ControllerName”的方法。
您需要像这样在基本控制器上定义 RouteAttribute:
[Route("admin/[controller]")]
注意 [controller]
将允许路由自动采用子 class 中的控制器名称。
我之前一直在我的 MVC 应用程序中使用这种方法
[Route("admin")]
public class AdminController : Controller
{
}
[Route("products")]
public class ProductsAdminController :AdminController
{
[Route("list")]
public IActionResult Index()
{
...
}
}
Url.RouteUrl() 返回 Index 操作 /admin/products/list/
现在在 .NET Core 中它忽略基本 class 路由属性,结果只是 /products/list/ 这是 .NET Core 的新功能吗?是否有任何设置使系统可以组合 action + controller + base-controller 路由?
据我所知,那是行不通的。您可以使用 areas,并通过将 [Area]
属性应用于基本控制器,您将获得您描述的结果:
[Area("admin")]
public class AdminController : Controller
[Route("products")]
public class ProductsAdminController : AdminController
在 Core 中同样适用。
我找不到一种方法来组合action + controller + base-controller automatically,但是可以实现什么您正在寻找这样的:
[Route("admin")]
public class AdminController : Controller { }
public class ProductsAdminController : AdminController
{
[Route("products/list")]
public IActionResult Index()
{
...
}
}
这种方法最终会生成 /admin/products/list
的 URL,但明显的缺点是每个操作都需要重复 products
。这可能是一个可以接受的妥协;这由你决定。你可以用一个常量使它更好位,像这样:
private const string RoutePrefix = "products";
[Route(RoutePrefix + "/list")]
public IActionResult Index()
{
...
}
这不是很好,因为它只是一种解决方法,但如果您不想使用
任何人仍在寻找在 .Net 核心 3.1 中定义“baseURL/ControllerName”的方法。 您需要像这样在基本控制器上定义 RouteAttribute:
[Route("admin/[controller]")]
注意 [controller]
将允许路由自动采用子 class 中的控制器名称。