Asp.Net Core MVC 案例系列一

为全局路由字段分配默认值

  MVC应用程序的URL路由有两种定义方式:
  (1)在Startup.Configure方法中通过UseMvc方法设置的路由规则会应用到整个应用程序中;
  (2)在每个控制器类以及其成员方法上通过Route特性设置的路由为局部规则,仅对当前控制器有效。

  URL路由以字符串的形式表示,其中有三个占位符,他们属于路由字典中的Key,需要写在大括号中。三个占位符如下:
  (1){area}:表示MVC程序中的“域”,通常用于划分程序功能,小型项目可以不使用。
  (2){controller}:表示控制器的名称。控制器后缀带有Controller可以省略。
  (3){action}:控制器类中的要执行的方法名称。
  此外,还可以自定义参数名,例如{controller}/{action}/{id?},其中id是传递给action方法的参数名称,?号代表该字段是可选的。

  在实际开发中,一般不会让用户记这么长的URL,对于程序主页,只要在浏览器地址栏中输入根URL就能访问默认页面,因此MVC框架默认值为{controller=Home}/{action=Index},当用户输入 http://someweb.com 时,实际上就是 http://someweb.com/Home/Index

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
        }
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseMvc(r =>
            {
                r.MapRoute("main", "{controller=Demo}/{action=Default}");
            });
        }
    }

局部的URL路由

  有时对于部分控制器,需要局部的URL路由。主要是通过在控制器类或者控制器类方法成员上附加Route特性来实现。它仅在目标对象上有效,优越性高于全局路由规则。

  一般为这种形式:[controller]/[action][controller]/[action]/{id?}

  访问如下控制器时,会用控制器名替换URL路由规则中的[controller]与[action],即 http://localhost/main/abouthttp://localhost/main/home

    [Route("[controller]/[action]")]
    public class MainController : Controller
    {
        public ActionResult About()
        {
            return Content("关于本站");
        }

        public ActionResult Home()
        {
            return Content("官方主页");

        }
    }

  访问如下GetList方法的URL是固定的,即 http://localhost/products/list.

    [Route("/products")]
    public class ProductController : Controller
    {
        [Route("list")]
        public ActionResult GetList()
        {
            return Content("产品列表");
        }
    }

自定义视图文件的查找位置

  在MVC的控制器中调用不带参数的View方法时,将返回与Action名称相同的视图。

  框架查找视图文件的默认路径有三个:
  /Views/{1}/{0}.cshtml
  /View/Shared/{0}.cshtml
  /Pages/Shared/{0}.cshtml
  {1}表示Controller的名称,{0}表示Action的名称。假设访问Goods控制器中的Reset方法,路径为 /Views/Goods/Reset.cshtml 。Shared目录下的视图一般用于布局页或共用视图。

  对于带有Area的MVC项目,其查找路径为:
  /Areas/{2}/Views/{1}/{0}.cshtml
  /Areas/{2}/Views/Shared/{0}.cshtml
  /Views/Shared/{0}.cshtml
  /Pages/Shared/{0}.cshtml
  此处{2}是Area的占位符。

  RazorViewEngineOptions类公开的AreaViewLocationFormats属性和ViewLocationFormats属性,都是用于配置视图的查找路径的,均为字符串,可添加多个。

  • 下面将视图文件查找目录从Views改为DemoViews。其中RazorViewEngine.ViewExtension字段能自动返回视图文件的扩展名。在项目中创建DemoViews目录,在DemoViews下创建Sample,Sample下是Test1.cshtml和Test2.cshtml。
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().AddRazorOptions(o =>
        {
            // 清除默认路径
            o.ViewLocationFormats.Clear();
            // 添加自定义的路径
            o.ViewLocationFormats.Add("/DemoViews/{1}/{0}" + RazorViewEngine.ViewExtension);
            o.ViewLocationFormats.Add("/DemoViews/Shared/{0}" + RazorViewEngine.ViewExtension);
        });
    }
    [Route("[controller]/[action]")]
    public class SampleController : Controller
    {
        public IActionResult Test1() => View();
        public IActionResult Test2() => View();
    }

  运行程序,分别用 http://localhost:1909/sample/test1http://localhost:1909/sample/test1 访问。

根据URL查询参数返回不同的视图

  控制器的View方法有以下几种方法返回视图;
  (1)无参数调用。这种视图文件名必须与当前操作方法名相同,即Action名与视图名一致。
  (2)指定视图名称。如果视图文件位于以当前控制器命名的目录下,那么指定视图名时不需要指定文件扩展名。
  (3)包含路径与文件扩展名。当视图文件不在当前控制器目录下,或不在设定查找路径内,则需要指定完整路径。

  • 本例中,更目录View下有Demo目录和Default.cshtml文件,Demo目录下有Pagedview.cshtml和Preview.cshtml。
    public class DemoController : Controller
    {
        public ActionResult GetInfo([FromQuery]string mode)
        {
            if(mode == "preview")
            {
                return View("Preview");
            }
            else if(mode == "pagedview")
            {
                return View("Pagedview");
            }
            return View("~/Views/Default.cshtml");
        }
    }

  mode参数的值将从URL查询参数(在URL中以问号开头的部分)中提取,所以在声明参数时要加上FromQuery特性,否则无法提取。
  Pagedview.cshtml和Preview.cshtml都位于与控制器同名目录下,因此调用View方法只指定视图名,但Default视图需明确路径。

posted @ 2021-01-05 21:12  一纸年华  阅读(9)  评论(0编辑  收藏  举报  来源