ID为的默认路由在asp.net核心中不起作用

时间:2018-10-01 17:00:57

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

这是我的控制者:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        var route = Request.Path.Value;
        return View("index" as object);
    }

    [HttpGet("{id}")]
    public IActionResult Index(int id)
    {
        return View("index id" as object);
    }
}

这是我的路线:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

url:/ 1->返回ID为
的索引 url:/ Home / Index / 1->返回没有ID的索引

我不明白为什么?

1 个答案:

答案 0 :(得分:1)

您使用的是mixed routing-第一个操作是conventional routing,第二个操作是attribute routing

当导航到/1时,您用id参数执行了第二个操作,因为它已被设置为对/{id}的路径使用属性路由(通过使用{{1 }}):属性路由覆盖常规路由。

导航到[HttpGet("{id}")]时,您没有设置/Home/Index/1参数就执行了第一个动作,这仅仅是因为您拥有的另一个动作已不再匹配,因为该动作已设置为使用属性路由({ {1}}),因此它根本不再与id匹配。对于/{id}中的常规路由模板,您已经说过/Home/Index/1是可选的,因此匹配仍然有效。

为了实现所需的功能,可以为此控制器专门使用属性路由。如下所示:

UseMvc

此处两个id属性的添加增加了对以下两条路由的支持:

  1. [Route("/")] [Route("[controller]/[action]")] public class HomeController : Controller { public IActionResult Index() { ... } [HttpGet("{id}")] public IActionResult Index(int id) { ... } } [Route(...)]
  2. //{id}

/Home/Index/Home/Index/{id}是占位符,分别代表控制器和动作的名称-如果您愿意,也可以只使用文字值[controller][action]更喜欢固定的东西。

您不一定需要同时使用 Home属性,但是Index版本可确保站点的根也匹配相同的控制器/操作对。