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/about ,http://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/test1 和 http://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视图需明确路径。
本文来自博客园,作者:一纸年华,转载请注明原文链接:https://www.cnblogs.com/nullcodeworld/p/18210633
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix