ASP.NET核心路由到HttpGet路由中的我的Name以外的其他方法

时间:2018-04-06 13:35:33

标签: c# asp.net asp.net-core asp.net-core-mvc asp.net-core-2.0

我的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方式,但逻辑似乎有所不同。

如何设置正确的网址?

1 个答案:

答案 0 :(得分:3)

使用[HttpGet("{query}", Name = "Get")],您可以说明网址必须是:

  

API / CreditData /查询

你真正想要的只是:

// 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属性。