如何在ASP.Net Core中映射具有锁定的控制器参数值的路由?

时间:2019-06-11 14:20:44

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

我有一个通用的ASP.Net Core控制器,希望在该控制器中根据路由执行其他操作。我的想法是映射不同的路由以使用同一控制器,其中每个映射将基于该路由设置不同的模式。 http://Website/Route1将映射到模式1,而http://Website/Route2将映射到模式2

            routes.MapRoute(
name: “Route1”,
template: “Route1” + "/{*queryParameters}",
defaults: new { controller = "GenericProcess", action = "RunGenericProcess", mode = “Mode1”, }
);


            routes.MapRoute(
name: “Route2”,
template: “Route2” + "/{*queryParameters}",
defaults: new { controller = "GenericProcess", action = "RunGenericProcess", mode = “Mode2”, }
);

这在用户不提供模式参数但任何人都可以通过显式提供模式参数来绕过我设置为默认值的情况下起作用。

http://Website/Route1/?mode=Mode2

我有什么办法可以为路由映射指定硬值,而不是可以覆盖的默认值?我还有另一种实现最终目标的方法,那就是构建一个多用途控制器,让我根据路线指定模式?

2 个答案:

答案 0 :(得分:0)

使用asp.net core mvc netcoreapp2.2尝试以下代码。

  1. Startup.cs

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
            routes.MapRoute(
                name: "Route1",
                template: "Route1" +"/{*queryParameters}",
                defaults: new { controller = "GenericProcess", action = "RunGenericProcess", mode = "Mode1", }
                );
    
    
            routes.MapRoute(
                name: "Route2",
                template: "Route2" +"/{*queryParameters}",
                defaults: new { controller = "GenericProcess", action = "RunGenericProcess", mode = "Mode2", }
                );
        });
    
  2. Controller

    public class GenericProcessController : Controller
    {
            public IActionResult RunGenericProcess(string mode)
            {
            return Ok(mode);
            }
    }
    

答案 1 :(得分:0)

这不是您问题的直接答案,但根据我的拙见和经验,这不是最好的选择。我可以想象URL中的“模式”会导致某些操作,因此您实际上是在查询字符串中编码该操作。最好使用属性路由,并且每个动作只有一个控制器,这将使读取,测试和维护更加容易。此概念遵循单一责任原则(查找SOLID原则)。

祝您一切顺利,:-)