简单 ASP.NET 核心路由问题

Simple ASP.NET Core routing issue

使用以下

app.UseMvc(routes =>
{
    routes.MapRoute(
       name: "beacon",
       template: "beacon/{id?}");

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

http://www.example.com/beacon 符合我的预期并命中 BeaconController

但是 http://www.example.com/beacon/001 没有击中任何控制器并进入 404

我错过了什么?

您指定了路由模式 URL,但没有提及 controller/action 应处理这些类型的请求。

您可以在定义路由时指定默认选项

app.UseMvc(routes =>
{
    routes.MapRoute(
      name: "beacon",
      template: "beacon/{id?}", 
      defaults: new { controller = "Beacon", action = "Index" }
    );

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

假设您的 Index 方法有一个 id 可为 nullable int 类型的参数

public class BeaconController : Controller
{
    public ActionResult Index(int? id)
    {
        if(id!=null)
        {
            return Content(id.Value.ToString());
        }
        return Content("Id missing");    
    }
}

另一种选择是从 UseMvc 方法中删除特定的路由定义,并使用属性路由来指定它。

public class BeaconController : Controller
{
    [Route("Beacon/{id?}")]
    public ActionResult Index(int? id)
    {
        if(id!=null)
        {
            return Content(id.Value.ToString());
        }
        return Content("Id missing");
    }
}

http://www.example.com/beacon 起作用的原因是请求结构与为默认路由定义的模式相匹配。