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