首页 > 解决方案 > ASP.NET Core 路由引擎混淆

问题描述

我正在尝试创建一个可靠的示例来说明 ASP.NET Core 路由引擎的工作原理,结果令我感到惊讶。

此示例背后的前提是点击控制器索引页面,然后使用 AJAX 请求加载数据。

我用 MVC 创建了一个 ASP.Net Core 应用程序。然后我添加了以下控制器:

namespace WebApplication2.Controllers {
    using Microsoft.AspNetCore.Mvc;

    public class SearchController : Controller {
        public IActionResult Index() {
            return View();
        }

        [HttpGet("{company}")]
        public IActionResult Get(string company) {
            return Ok($"company: {company}");
        }

        [HttpGet("{country}/{program}")]
        public IActionResult Get(string country, string program) {
            return Ok($"country: {country} program: {program}");
        }
    }
}

我还创建了一个简单的视图,以与带有“搜索页面”字样的索引一起使用,以便您可以看到它被调用。

问题是由此创建的路由没有意义。

预期成绩

以公司:“Abc”,国家:“加拿大”和程序:“管道”为例:

实际结果

然而,它根本不像这样工作。相反,这些是结果:

产生:“国家:搜索程序:索引”

产生:“国家:搜索程序:Abc”

产生:404 未找到

显然 Index 和 Get string company 的路由是混淆的,它将控制器名称作为参数。

我可以使用以下代码使其工作,但我认为路由引擎会产生相同的结果:

    public class SearchController : Controller {
        public IActionResult Index() {
            return View();
        }

        [HttpGet("[controller]/{company}")]
        public IActionResult Get(string company) {
            return Ok($"company: {company}");
        }

        [HttpGet("[controller]/{country}/{program}")]
        public IActionResult Get(string country, string program) {
            return Ok($"country: {country} program: {program}");
        }

我的理解有什么问题?必须明确指定似乎很愚蠢[controller]

标签: c#asp.net-core

解决方案


指定类上方的根路由

[Route("Search")]
public class SearchController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    [HttpGet("{company}")]
    public IActionResult Get(string company)
    {
        return Ok($"company: {company}");
    }

    [HttpGet("{country}/{program}")]
    public IActionResult Get(string country, string program)
    {
        return Ok($"country: {country} program: {program}");
    }
}

推荐阅读