為全局路由字段分配默認(rèn)值
??MVC應(yīng)用程序的URL路由有兩種定義方式:
??(1)在Startup.Configure方法中通過(guò)UseMvc方法設(shè)置的路由規(guī)則會(huì)應(yīng)用到整個(gè)應(yīng)用程序中;
??(2)在每個(gè)控制器類以及其成員方法上通過(guò)Route特性設(shè)置的路由為局部規(guī)則,僅對(duì)當(dāng)前控制器有效。
??URL路由以字符串的形式表示,其中有三個(gè)占位符,他們屬于路由字典中的Key,需要寫在大括號(hào)中。三個(gè)占位符如下:
??(1){area}:表示MVC程序中的“域”,通常用于劃分程序功能,小型項(xiàng)目可以不使用。
??(2){controller}:表示控制器的名稱。控制器后綴帶有Controller可以省略。
??(3){action}:控制器類中的要執(zhí)行的方法名稱。
??此外,還可以自定義參數(shù)名,例如{controller}/{action}/{id?},其中id是傳遞給action方法的參數(shù)名稱,?號(hào)代表該字段是可選的。
??在實(shí)際開發(fā)中,一般不會(huì)讓用戶記這么長(zhǎng)的URL,對(duì)于程序主頁(yè),只要在瀏覽器地址欄中輸入根URL就能訪問(wèn)默認(rèn)頁(yè)面,因此MVC框架默認(rèn)值為{controller=Home}/{action=Index},當(dāng)用戶輸入 http://someweb.com 時(shí),實(shí)際上就是 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路由
??有時(shí)對(duì)于部分控制器,需要局部的URL路由。主要是通過(guò)在控制器類或者控制器類方法成員上附加Route特性來(lái)實(shí)現(xiàn)。它僅在目標(biāo)對(duì)象上有效,優(yōu)越性高于全局路由規(guī)則。
??一般為這種形式:[controller]/[action],[controller]/[action]/{id?}。
??訪問(wèn)如下控制器時(shí),會(huì)用控制器名替換URL路由規(guī)則中的[controller]與[action],即 http://localhost/main/about ,http://localhost/main/home 。
[Route("[controller]/[action]")]
public class MainController : Controller
{
public ActionResult About()
{
return Content("關(guān)于本站");
}
public ActionResult Home()
{
return Content("官方主頁(yè)");
}
}
??訪問(wèn)如下GetList方法的URL是固定的,即 http://localhost/products/list.
[Route("/products")]
public class ProductController : Controller
{
[Route("list")]
public ActionResult GetList()
{
return Content("產(chǎn)品列表");
}
}
自定義視圖文件的查找位置
??在MVC的控制器中調(diào)用不帶參數(shù)的View方法時(shí),將返回與Action名稱相同的視圖。
??框架查找視圖文件的默認(rèn)路徑有三個(gè):
??/Views/{1}/{0}.cshtml;
??/View/Shared/{0}.cshtml;
??/Pages/Shared/{0}.cshtml。
??{1}表示Controller的名稱,{0}表示Action的名稱。假設(shè)訪問(wèn)Goods控制器中的Reset方法,路徑為 /Views/Goods/Reset.cshtml 。Shared目錄下的視圖一般用于布局頁(yè)或共用視圖。
??對(duì)于帶有Area的MVC項(xiàng)目,其查找路徑為:
??/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屬性,都是用于配置視圖的查找路徑的,均為字符串,可添加多個(gè)。
- 下面將視圖文件查找目錄從Views改為DemoViews。其中
RazorViewEngine.ViewExtension字段能自動(dòng)返回視圖文件的擴(kuò)展名。在項(xiàng)目中創(chuàng)建DemoViews目錄,在DemoViews下創(chuàng)建Sample,Sample下是Test1.cshtml和Test2.cshtml。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddRazorOptions(o =>
{
// 清除默認(rèn)路徑
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();
}
??運(yùn)行程序,分別用 http://localhost:1909/sample/test1 和 http://localhost:1909/sample/test1 訪問(wèn)。
根據(jù)URL查詢參數(shù)返回不同的視圖
??控制器的View方法有以下幾種方法返回視圖;
??(1)無(wú)參數(shù)調(diào)用。這種視圖文件名必須與當(dāng)前操作方法名相同,即Action名與視圖名一致。
??(2)指定視圖名稱。如果視圖文件位于以當(dāng)前控制器命名的目錄下,那么指定視圖名時(shí)不需要指定文件擴(kuò)展名。
??(3)包含路徑與文件擴(kuò)展名。當(dāng)視圖文件不在當(dāng)前控制器目錄下,或不在設(shè)定查找路徑內(nèi),則需要指定完整路徑。
- 本例中,更目錄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參數(shù)的值將從URL查詢參數(shù)(在URL中以問(wèn)號(hào)開頭的部分)中提取,所以在聲明參數(shù)時(shí)要加上FromQuery特性,否則無(wú)法提取。
??Pagedview.cshtml和Preview.cshtml都位于與控制器同名目錄下,因此調(diào)用View方法只指定視圖名,但Default視圖需明確路徑。