1路由
路由模版:
(1)在startup.cs或者属性中定义
(2描述URL路径如何匹配Actions
(3)用于产生URLs链接,这些产生的链接通常在响应中返回
路由两种:传统路由和属性路由。将路由放置在Controller或Action上使它成为属性路由。终端路由-在ASP.NET Core 3.0中新增的默认路由系统。
路由配置:UseRouting(),UseEndpoints。调用UseEndpoints的MapControllers方法匹配Controller的属性路由,调用MapControllerRoute或MapAreaControllerRoute匹配传统路由和属性路由。
1.1 传统路由
传统路由只匹配app中定义的Action和Contoller的联合,这是为了简化传统路由重叠的场景。使用MapControllerRoute,MapDefaultControllerRoute和MapAreaContollerRoute自动基于触发顺序给它们的
enderpoints赋值(顺序)。路由出现的越早,具有更高的优先级。传统路由依赖顺序。一般而言,带有area的路由应该放置在前面因为它们比没有area的路由更加具体。专用传统路由匹配所有的路由参数例如{*article}使路由匹配范围太广,意味着你想匹配的其他路由会被它匹配上,将这种路由放置在路由表后面来阻止无匹配。
public IActionResult Edit(int id) { return ControllerContext.MyDisplayRouteInfo(id); } [HttpPost] public IActionResult Edit(int id, Product product) { return ControllerContext.MyDisplayRouteInfo(id, product.name); }
/Products33/Edit/17 ,Post请求时匹配下面,其他请求时匹配上面
路由名称在应用范围内必须是唯一的,对URL匹配和处理请求无影响,只用于产生URL。
1.2 属性路由
REST API应该使用属性路由来将app的功能建模成一组资源(操作由HTTP动词表示)。属性路由使用一系列属性来匹配Action。属性路由匹配更加具体。使用属性路由,Contoller和Action的名称就无所谓了,除非使用了令牌替换。
[Route("")] [Route("Home")] [Route("Home/Index")] [Route("Home/Index/{id?}")] public IActionResult Index(int? id ) { return View(); } [Route("Home/Privacy")] [Route("Home/Privacy/{id?}")] public IActionResult Privacy(int? id) { return View(); }
[Route("")] [Route("Home")] [Route("Home/Index")] [Route("Home/Index/{id?}")] public IActionResult MyIndex(int? id) { return ControllerContext.MyDisplayRouteInfo(id); } [Route("Home/About")] [Route("Home/About/{id?}")] public IActionResult MyAbout(int? id) { return ControllerContext.MyDisplayRouteInfo(id); }
使用令牌替换
[Route("")] [Route("Home")] [Route("[controller]/[action]")] public IActionResult Index() { return ControllerContext.MyDisplayRouteInfo(); } [Route("[controller]/[action]")] public IActionResult About() { return ControllerContext.MyDisplayRouteInfo(); }
保留路由名称:action,area,controller,hanler,page
HTTP 动词模板:[HttpGet] [HttpPost] [HttpPut] [HttpDelete] [HttpHead] [HttpPatch]
[Route("api/[controller]")] [ApiController] public class Test2Controller : ControllerBase { [HttpGet] // GET /api/test2 public IActionResult ListProducts() { return ControllerContext.MyDisplayRouteInfo(); } [HttpGet("{id}")] // GET /api/test2/xyz public IActionResult GetProduct(string id) { return ControllerContext.MyDisplayRouteInfo(id); } [HttpGet("int/{id:int}")] // GET /api/test2/int/3 public IActionResult GetIntProduct(int id) { return ControllerContext.MyDisplayRouteInfo(id); } [HttpGet("int2/{id}")] // GET /api/test2/int2/3 public IActionResult GetInt2Product(int id) { return ControllerContext.MyDisplayRouteInfo(id); } }
{id:int}限制了id参数必须可以转换成整数,否则不匹配路由。
2 配置(appsettings.json)
3 运行发布
将应用程序输出类型设置为类库时,报“无法运行项目,RunnCommand属性未定义”的错误,发布的文件无法成功启动(无论是独立版本还是框架依赖版本)。但若将项目设置成控制台应用程序,发布时会生成无效的.exe文件(测试结果显示可能还不是本程序对应的exe)
CubeDemoNC程序发布可以成功运行,但vs中调试时,本地静态文件(css,js)无法加载报错