简单 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
起作用的原因是请求结构与为默认路由定义的模式相匹配。
使用以下
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
起作用的原因是请求结构与为默认路由定义的模式相匹配。