代码之家  ›  专栏  ›  技术社区  ›  Lars Holdgaard

ASP。NET核心路由到HttpGet路由中除我的名字以外的其他方法

  •  5
  • Lars Holdgaard  · 技术社区  · 7 年前

    我的ASP中有一个简单的控制器。NET核心应用程序。其思想是调用控制器 CreditData ,我的端点可以是 /api/creditdata/ 然后它应该具有默认的预期API方法。

    我想要两种方法:

    • /api/creditdata 它应该有一个查询,如 /api/creditdata?query=text1,text2
    • /api/creditdata/value 其中查询,如 /api/creditdata/text1 应该有用

    我已尝试按以下方式进行设置:

       [Route("api/[controller]")]
        public class CreditDataController : Controller
        {
            private CreditDataService _creditDataService;
            public CreditDataController()
            {
                _creditDataService = new CreditDataService();
            }
    
            // GET: api/CreditData?query=text1,text2
            [HttpGet("{query}", Name = "Get")]
            public List<CreditData> Get([FromQuery] string query)
            {
                // code
            }
    
            // GET: api/CreditData/GetByRegistration/33514322
            [HttpGet("{query}", Name= "GetByRegistration")]
            public CreditData GetByRegistration(string query)
            {
                // code
            }
    
    
        }
    

    我有一个很好的标准 Startup.cs 文件:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                    app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
                    {
                        HotModuleReplacement = true,
                        ReactHotModuleReplacement = true
                    });
                }
                else
                {
                    app.UseExceptionHandler("/Home/Error");
                }
    
                app.UseStaticFiles();
    
                app.UseMvc(routes =>
                {
                    routes.MapRoute(
                        name: "default",
                        template: "{controller=Home}/{action=Index}/{id?}");
    
                    routes.MapSpaFallbackRoute(
                        name: "spa-fallback",
                        defaults: new { controller = "Home", action = "Index" });
                });
            }
    

    但两者都不是我想要的方式。我已经习惯了ASP。NET MVC 4/5方式,但这里的逻辑似乎不同。

    如何设置正确的URL?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Kirk Larkin    7 年前

    具有 [HttpGet("{query}", Name = "Get")] ,您表示URL必须类似于:

    api/信用数据/查询

    你真正想要的只是:

    // GET: api/CreditData?query=text1,text2
    [HttpGet(Name = "Get")]
    public List<CreditData> Get([FromQuery] string query)
    

    提供 {query} HttpGet 属性指定它必须是路由的一部分,这不是您想要的,因此我将其删除。

    你的第二个 [HttpGet] 是为完全相同的路线。为此,您需要:

    // GET: api/CreditData/GetByRegistration/33514322
    [HttpGet("GetByRegistration/{query}", Name= "GetByRegistration")]
    public CreditData GetByRegistration(string query)
    

    在这里,我添加了 GetByRegistration 表明这是路线的静态部分。在这种情况下,您的 query 根据我上面提到的规则,参数将从路由填充。

    注意:除非您在其他地方按名称引用路由,否则不需要 Name 属性。