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 @   一纸年华  阅读(11)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示

目录导航

为全局路由字段分配默认值
局部的URL路由
自定义视图文件的查找位置
根据URL查询参数返回不同的视图