传统mvc项目的路由,在App_Start下RouteConfig.cs文件下设置,.net core的话,路由设置在主目录下的Startup.cs里设置。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); }
app.UseResponseCaching();// 中间件缓存,配合 ResponseCache
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute("blog", "blog/{pagenum?}",
defaults: new { Controller = "Blog", Action = "Index" },
constraints: new { pagenum = @"[1-9][0-9]{0,}" });
endpoints.MapControllerRoute("blog", "blog/{router}/{id?}",
defaults: new { Controller = "Blog", Action = "List" },
constraints: new { router = @"\w{0,}", id = @"\w{24}" });
endpoints.MapControllerRoute(name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
}
如上图,在Configure方法里设置路由。
第一段配置,当访问blog这个路由时,如果后面是数字参数或者啥参数都没,则访问Blog控制下的Index方法,代码如下:
public async Task<IActionResult> Index(int pagenum)
{
if (pagenum == 0) pagenum = 1;
ViewBag.NowPage = pagenum;
return View(await articleRepository.FindByPage(pagenum));
}
如果传数字,则是指定访问的页码。
第二段配置,如果参数后面是字符串,则跳转到Blog控制下的,List方法,代码如下:
public async Task<IActionResult> List(string router, string id = "") { return View("~/Views/Blog/List.cshtml",
await articleRepository.FindByCatalog(router,10,id)); }
传统mvc开发里面,设置伪静态,也是稍微有点麻烦的,需要将所有请求教给asp.net进程来处理,css,js文件都要另外设置,在.net core里,由于所有请求都会先请求内置的Kestrel服务器,路由增加以下节点:
endpoints.MapControllerRoute("article", "article/{ID}.html",
defaults: new { Controller = "Blog", Action = "Details" },
constraints: new { ID = @"\w{24}" });
控制器如下
public async Task<IActionResult> Details(string ID) { return View("~/Views/Blog/Details.cshtml",
await articleRepository.FindOne(ID)); }
一切就是那么简单。
另外,我说一下,如果是html请求,kestrel会先去wwwroot即静态目录找,是否存在此html,如果存在,则直接输出页面,就不会在走路由。
举例,假设请求https://localhost:5001/article/1.html,正常情况会到路由,但是如果,在wwwroot目录下,新建article文件夹,再新建1.html,则会直接输出此1.html的内容,不会再走路由了。