简单的ASP.NET核心路由问题

时间:2018-06-13 17:47:53

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

使用以下

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

我错过了什么?

1 个答案:

答案 0 :(得分:2)

您指定了路由模式URL,但未提及控制器/操作应处理这些类型的请求。

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

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 type

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工作的原因是因为该请求结构与为默认路由定义的模式匹配。