asp.net core 路由及伪静态设置

 0 0条评论

传统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的内容,不会再走路由了。

本文作者:双黑

版权声明:本站文章欢迎链接分享,禁止全文转载!

游客