【问题标题】:How can I map a route with locked controller parameter values in ASP.Net Core?如何在 ASP.Net Core 中映射具有锁定控制器参数值的路由?
【发布时间】:2019-06-13 00:29:02
【问题描述】:

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

            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

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

【问题讨论】:

  • mode 是什么意思?与我们分享控制器的定义。
  • @TaoZhou,想象一下控制器动作内部模式的 switch 语句。我希望能够根据路由指定模式参数,而不让用户能够使用我不想要的路由设置模式。

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


【解决方案1】:

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

【讨论】:

  • 有了这段代码,我仍然可以使用“website/Route1/?mode=Mode2”,它会返回“Mode2”,这是我想要避免的。我不希望用户能够控制模式参数。
  • @Eric 是否有任何演示可以重现您的问题?我无法用这些代码重现您的问题。
【解决方案2】:

这不是对您问题的直接回答,但根据我的拙见和经验,这不是最好的做法。我可以想象你在 URL 中的“模式”会导致一些动作,因此你实际上是在查询字符串中对动作进行编码。最好使用属性路由并为每个操作配备一个控制器,这将使其更易于阅读、测试和维护。此概念遵循单一职责原则(查找 SOLID 原则)。

祝您的编码冒险万事如意 :-)

【讨论】:

  • 在编写业务线代码时,我确实尝试坚持使用 SOLID 原则,但这更像是一个可重用的架构组件,我可以在多个应用程序中利用它,每个应用程序都有非常不同的业务需求.如果我能做到这一点,它将为我节省大量重复的样板代码。
猜你喜欢
  • 2021-09-21
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 2018-01-30
  • 2012-03-25
  • 2015-08-05
相关资源
最近更新 更多