考虑以下路线:
/home/about
=>控制器=";Home";,动作=";关于">- CCD_ 2=>控制器=";Home";,动作=";"隐私">
- CCD_ 3=>控制器=";账户";,动作=";登录">
- CCD_ 4=>控制器=";账户";,动作=";寄存器">
- CCD_ 5=>控制器=";用户";,动作=";配置文件">
我在不同控制器中的操作不会相互重叠,因此我想要这些更容易阅读和使用的路线:
/about
=>控制器=";Home";,动作=";关于">- CCD_ 7=>控制器=";Home";,动作=";"隐私">
- CCD_ 8=>控制器=";账户";,动作=";登录">
- CCD_ 9=>控制器=";账户";,动作=";寄存器">
- CCD_ 10=>控制器=";用户";,动作=";配置文件">
为此,我有一个有效的方法:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
"main",
"/",
new { Controller = "Home", Action = "Index" });
endpoints.MapControllerRoute(
"home",
"/{action}/{id?}",
new { Controller = "Home" });
endpoints.MapControllerRoute(
"account",
"/{action}/{id?}",
new { Controller = "Account" });
endpoints.MapControllerRoute(
"user",
"/{action}/{id?}",
new { Controller = "User" });
});
问题是,对于每个控制器,我都必须重复这一点。有没有办法让这个自动的?类似这样的东西:
// look into all controllers and find the first action that matches
endpoints.MapControllerRoute(
"default",
"/{action}/{id?}");
这就是我最终得到的:
我用的不是UseEndpoints
,而是
app.MapControllers();
然后,对于每个控制器,我使用了这个属性:
[Route("/[action]/{id?}")]
public class HomeController : Controller
{
//...
}
只有一个动作(对于主页(需要它自己的属性:
[Route("/")]
public IActionResult Index()
{
//...
}